思路就是:先反转每一个单词,然后再去反转整个字符串。
1.reverse函数中为什么ch=reverse(ch,i,j-1);,我们用j表示空格在哪儿,所以下标j所对应的值是个空格,我们交换的end应该是第一个空格前面的字符,所以需要j-1。
2.在进行整体反转的时候为什么需要去掉多余的部分?因为有的字符串可能存在多余的空格(参见原题链接中的样例),进行反转之后是多余的空格是不存在的,字符串头尾不存在空格,单词之间最多只有一个,所以反转后会有空出来的位置,那么这些位置上就会存在其他的单词,我们的结果不需要这些富余字符,所以需要截取。
Java 代码
/*
the sky is blue
先反转每个单词: eht yks si eulb
然后反转整个字符串: blue is sky the
*/
class Solution {
char[] ch;
public String reverseWords(String s) {
int k=0;
ch=s.toCharArray();
for(int i=0;i<ch.length;i++){
//寻找第一个单词的第一个位置,第一个字符可能是空格
while(i<ch.length&&ch[i]==' ')i++;
if(i==ch.length)break;
int j=i;
//通过空格分隔单词
while(j<ch.length&&ch[j]!=' ')j++;
//反转单词
ch=reverse(ch,i,j-1);
//添加空格分割单词和单词
if(k!=0) ch[k++]=' ';
//修改字符数组
while(i<j){
ch[k++]=ch[i++];
}
}
//去掉多余部分后的字符串进行整体反转
StringBuilder sb=new StringBuilder(new String(ch).substring(0,k)).reverse();
return sb.toString();
}
//字符串反转
public char[] reverse(char[] array,int i,int j){
while(i<j){
char c=array[i];
array[i]=array[j];
array[j]=c;
i++;j--;
}
return array;
}
}