「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」
描述
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。
- 示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
复制代码
- 示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
复制代码
- 示例3
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
复制代码
- 提示
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
复制代码
解析
利用两个指针,一个快,一个慢,快指针遇到空格就停下来,把经过的非空放到stringbuilder中,要加上中间的空格" ",注意substring的写法,别写成subString,然后这个函数是前闭后开 之后快指针遇到空格就跳过,直到遇到新的不为空的,把慢指针挪过去j = i,继续下一个单词的计数,注意最后的单词,后面还跟着" ",需要再trim()一下
示例
class Solution {
public String reverseWords(String s) {
//双指针
String ss = s.trim();//去掉首尾的空格
int i = ss.length() - 1; int j = i;
StringBuilder sb = new StringBuilder();
while(i >= 0){
while (i >= 0 && ss.charAt(i) != ' ') i--;
sb.append(ss.substring(i+1,j+1)+" ");//前闭后开 注意这个substring 不是驼峰命名 不要搞错了
while (i >= 0 && ss.charAt(i) == ' ') i--;
j = i;
}
return sb.toString().trim();
}
}
复制代码
运行结果:
执行结果:通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:35.3 MB, 在所有 Java 提交中击败了84.82%的用户