解题思路:
①移除多余空格
② 将整个字符串反转
③将每个单词反转
class Solution {
public String reverseWords(String s) {
StringBuilder sb =removeSpace(s);
//去除空格
reverString(sb, 0, sb.length() - 1);
//反转每个字符
reverseEachWord(sb);
//反转每个单词
return sb.toString();
}
//移除空格
private StringBuilder removeSpace(String s) {
int start = 0;
int end =s.length() - 1;
//从字符串开始索引遍历,只要寻找到第一次不是空格的位置,记录该位置,目的为了去除字符串前缀空格
while(s.charAt(start) == ' ') start++;
//从字符串末尾索引遍历,只要寻找到第一次不是空格的位置,记录该位置,目的为了去除字符串后缀空格
while(s.charAt(end) == ' ') end--;
StringBuilder sb = new StringBuilder();
//去除中间多余空格
while(start <= end) {
char c = s.charAt(start);
//c不是空格,直接添加进sb,由于每个单词是有一个空格隔开,当遇见空格时,要观察sb中末尾索引处是否是空格,若是则不添加
if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
sb.append(c);
}
start++;
}
return sb;
}
//反转字符串
private void reverString(StringBuilder sb, int start, int end) {
while(start < end) {
char temp =sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
}
//反转每个单词,快慢指针
private void reverseEachWord(StringBuilder sb) {
int start = 0;
int end = 1;
int n = sb.length();
while(start < n) {
//当遇到空格时,则表明单词需要反转
while(end < n && sb.charAt(end) != ' ') {
end++;
}
reverString(sb, start, end - 1);
//记录下一次慢指针位置
start = end + 1;
//记录下一次快指针位置
end = start + 1;
}
}
}