151. 翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
class Solution {
public String reverseWords(String s) {
int n=s.length();
StringBuilder str=new StringBuilder();
for(int i=n-1;i>=0;){
while(i>=0&&s.charAt(i)==' '){
i--;
}
if(i<0){
break;
}
int j=i;
while(j>=0&&s.charAt(j)!=' '){
j--;
}
str.append(s.substring(j+1,i+1));//substring() 方法返回的子串包括 start 处的字符,但不包括 stop 处的字符
str.append(' ');
i=j;
}
int m=str.length();
if(m>0){
str.delete(m-1,m);
}
return str.toString();
}
}
执行用时:3 ms
内存消耗:39.8 MB
试了好多方法,还是这个评论区大神的方法的用时和内存消耗比较小,本来看到50%左右的排名还觉得应该有更好的方法,没想到官方解还不如这个,hhhh而且感觉这个比较好理解。我个菜菜也可以get!开心!
但是有一点就是同时定义和不定义m和n用时都是3ms,一直觉得这种length定义的话时间消耗好像会少点呢。。