思路:
一些同学会使用split库函数,分隔单词,然后定义一个新的string字符串,最后再把单词倒序相加,那么这道题题目就是一道水题了,失去了它的意义。
所以这里我还是提高一下本题的难度:不要使用辅助空间,空间复杂度要求为O(1)。
不能使用辅助空间之后,那么只能在原字符串上下功夫了。
想一下,我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了。
所以解题思路如下:
- 移除多余空格
- 将整个字符串反转
- 将每个单词反转
class Solution {
public String reverseWords(String s) {
//源字符数组
char[] initialArr=s.toCharArray();
//新字符串
char[] newArr=new char[initialArr.length+1];//下面循环添加“单词”,最终末尾的空格不会返回
int newArrPos=0;
//i来进行整体对源字符数组从后往前遍历
int i=initialArr.length-1;
while(i>=0){
while(i>=0&&initialArr[i]==' '){i--;}//跳过空格
//此时i位置是边界或!=空格,先记录当前索引,之后的while用来确定单词的首字母位置
int right=i;
while(i>=0&&initialArr[i]!=' '){i--;}
//指定区间单词取出(由于i为首字母的前一位,所以这里+1),取出的每组末尾都带有一个空格
for(int j=i+1;j<=right;j++){
newArr[newArrPos++]=initialArr[j];
if(j==right){
newArr[newArrPos++]=' ';//空格
}
}
}
//若是原始字符串没有单词,直接返回空字符串;若是有单词,返回0-末尾空格索引前范围的字符数组(转成String返回)
if(newArrPos==0){
return "";
}else{
return new String(newArr,0,newArrPos-1);
}
}
}