难度:中等
频次:69
题目:
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
翻转后单词间应当仅用一个空格分隔。
翻转后的字符串中不应包含额外的空格。
解题思路:一次遍历(倒序+标记位置+截取)
注意
- 遍历的时候分成两种形式,第一种是遍历跳过空格,直到非空格的位置,一种是遍历非空格,直到是空格的位置
- 两次遍历的顺序,最好是i先遍历非空格,再遍历空格,这样子不用去考虑到开头是否有空格的特俗情况,如果是先遍历空格,再遍历非空格,那么最后i=j的情况,而且这个时候不去处理就会多出一个空格
- String的函数需要注意
- s.charAt();
- s.substring(i,j);[i,j),包括i,不包括j
- s.toString();
- s.toCharArray();
代码
先遍历字母,再遍历非空格
class Solution {
public String reverseWords(String s) {
int len=s.length();
int i=len-1;
StringBuffer sb=new StringBuffer();
while(i>=0){
int j=i;
//i的下标移动到第一个空格处
while(i>=0&&s.charAt(i)!=' ') i--;
//如果结果集里有东西,添加空格
if(sb.length()>0) sb.append(" ");
//裁剪[i+1,j]
sb.append(s.substring(i+1,j+1));
//移动i到后面不为空格处
while(i>=0&&s.charAt(i)==' ') i--;
}
return sb.toString();
}
}
先遍历空格,再遍历字母
class Solution {
public String reverseWords(String s) {
int len=s.length();
int i=len-1;
StringBuffer sb=new StringBuffer();
while(i>=0){
//i的下标移动到第一个非空格处
while(i>=0&&s.charAt(i)==' ') i--;
int j=i;
//把i移动到空格处
while(i>=0&&s.charAt(i)!=' ') i--;
//如果结果集里有东西并且最后遍历i!=j,添加空格
if(sb.length()>0&&i!=j) sb.append(" ");
//裁剪[i+1,j]
sb.append(s.substring(i+1,j+1));
}
return sb.toString();
}
}