题目描述
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的单词分隔开。
返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例
提交的代码
class Solution {
public String reverseWords(String s) {
StringBuilder res=new StringBuilder();
//先找到start和end的index,这个过程也是去除首尾的空格
int start=0;
int end=s.length()-1;
int right,left;
while(s.charAt(start)==' '){
start++;
}
while(s.charAt(end)==' '){
end--;
}
//start和end的index已经确定,下面需要给left和right赋初始值
right=end+1;
left=end;
boolean flag=false;
while(left>=start){
//找到空格的Index
while(s.charAt(left)!=' '){
left--;
if(left<start){
flag=true;
break;
}
}
if(flag)break;
//结果字符串赋值
res.append(s.substring(left+1,right));
//再添加空格
res.append(" ");
//判断单词之间是否有若干空格,找到第一个空格
while(left>=start&&s.charAt(left-1)==' ')left--;
right=left;
left--;
}
res.append(s.substring(left+1,right));
return res.toString();
}
}
思想:双指针法。题目要求去除string的首尾空格,因此需要两个指针start end来记录去除首尾空格之后的内容的起始和结束index,right和left两个指针的初始index为end+1和end,然后left去找遇到的第一个空格,然后用substring()方法截取单词加入到StringBuilder对象中,StringBuilder对象再添加一个空格,然后left需要去去除单词间的多余的空格,找到单词间若干空格的第一个空格,赋值给right,然后left再去找下一个空格,然后截取字符串。
示意图如下:
学习到的东西
看了大神的方法,他的方法分为三步:
- 去除首尾以及单词间的空格
- 将去重过的字符串全部反转
- 再把每个单词都反转