タイトルの説明
ACコード
アイデアは、まず各単語を逆にし、次に文字列全体を逆にします。
1.なぜreverse関数ch=reverse(ch,i,j-1);
で、スペースの位置を示すためにjを使用するので、添え字jに対応する値はスペースであり、交換する最後は最初のスペースの前の文字でなければならないため、j-1が必要です。
2.全体の反転を実行するときに、なぜ余分な部品を削除する必要があるのですか?一部の文字列には余分なスペースがある可能性があるため、反転後、余分なスペースはなく、文字列の最初と最後にスペースはなく、単語間にはスペースが1つしかないため、反転後の位置は空になります。次に、これらの位置に別の単語があります。結果にはこれらの余分な文字は必要ないため、それらをインターセプトする必要があります。
/*
the sky is blue
先反转每个单词: eht yks si eulb
然后反转整个字符串: blue is sky the
*/
class Solution {
public String reverseWords(String s) {
int k=0;
char[] 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;
}
}
他にもメソッドがあり、Stringクラスのメソッドを完全に利用でき、ダブルポインターで解決できます。