题目描述:
题目:
输入一个英文句子,翻转句子中单词的顺序,但单词内 字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。注意:
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
思路分析:
- 去掉单词前后的空字符串;
- 设置两个指针left和right,left一直向前移动,直到遇到空格” “停下来,将区间left~right的字符全部加入结果字符串StringBuilder res中;
- 再次移动指针,直到遇到不是 空格" "时,将right指向left;
- 重复上面的操作,直到left == 0。
参考代码:
public String reverseWords(String s) {
if(s == null || s.length() == 0)return s;
s = s.trim();
int left = s.length() - 1;
int right = left;
StringBuilder res = new StringBuilder();
while(left >= 0){
while(left >= 0 && s.charAt(left) != ' ')left --;
res.append(s.substring(left + 1, right + 1) + " ");
while(left >= 0 && s.charAt(left) == ' ')left --;
right = left;
}
return res.toString().trim();
}
注意:
上述代码在力扣运行成功,但是在牛客运行不成功。
而力扣运行成功:
究其原因:输入" “的结果不同,牛客原样输出:” “;而力扣输出为”"。
要在牛客运行成功,只需修改一行代码:
if(s == null || s.length() == 0)return s;
改为
if(s == null || s.length() == 0 || s.trim().length() == 0)return s;
小结:
本题用的StringBuilder而不是String,String是不可变字符串,所以会重新创建字符串,效率比较低。