解析(不使用辅助空间,而且空间复杂度为O(1))
题目要求:给你一个字符串 s
,请你反转字符串中 单词 的顺序。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue"
输出:"blue is sky the"
大体思路:分三步:
①去除多余空格
②反转整个字符串:可以使得整个字符的反转,虽然使得单词内的字符顺序反了,但是单词与单词之间的顺序实现反转
③按照单词反转字符串:对单词进行反转,这样反反得正。
具体做法:
按照上述的三步,写成三个方法。因为步骤③会复用步骤②的代码。
注意点:(用于判断的语句的顺序有讲究)
①判断的语句的顺序:如代码中的注释所示
②StringBulider.setCharAt(int i, char c) 将第i个代码单元设置为c
③StringBulider.charAt(int i)查找i处的字符
代码:
class Solution {
public String reverseWords(String s) {
StringBuilder str = new StringBuilder();
str = removeBlank(s);
reverseString(0, str.length() - 1, str);
reverseEachWord(str);
return str.toString();
}
// 去除空格
public StringBuilder removeBlank(String s) {
StringBuilder str = new StringBuilder();
int left = 0, right = s.length() - 1;
while (s.charAt(left) == ' ') left++;
while (s.charAt(right) == ' ') right--;
while (left <= right) {
if (s.charAt(left) != ' ' || s.charAt(left + 1) != ' ') str.append(s.charAt(left));
left++;
}
return str;
}
// 反转一段字符
public void reverseString(int start, int end, StringBuilder str){
while (start < end) {
char temp = str.charAt(start);
str.setCharAt(start,str.charAt(end));
str.setCharAt(end, temp);
start++;
end--;
}
}
// 反转每一个单词
public void reverseEachWord(StringBuilder str){
int start = 0, end = 0;
while(end <= str.length()) {
// 注意这个||前后顺序不能错,否则当end == length时,先判断charAt()会溢出报错
if (end == str.length() || str.charAt(end) == ' ' ) {
reverseString(start, end - 1, str);
end++;
start = end;
} else {
end++;
}
}
}
}