151、翻转字符串里的单词
重点:能够灵活运用字符串反转
- 先整体反转,再局部反转(双指针)
方法一:先整体反转,再局部反转
public String reverseWords(String s) {
//移动空格
StringBuilder sb = removeBlankSpace(s);
//反转整个字符串
reverseString(sb, 0, sb.length() - 1);
//翻转单词
reverseEachWord(sb);
return sb.toString();
}
/**
* 去除空格
*/
public StringBuilder removeBlankSpace(String s) {
int start = 0, end = s.length() - 1;
//去除首位空格
while (s.charAt(start) == ' ') start++;
while (s.charAt(end) == ' ') end--;
//存放结果
StringBuilder sb = new StringBuilder();
//去除中间的重复空格 必须相等,否则奇数会少判断一个字符
while (start <= end) {
char s1 = s.charAt(start);
//添加进的条件是,该数字不为空格 或者 是空格但是前一个数字不是空格
if (s1 != ' ' || sb.charAt(sb.length() - 1) != ' ') {
sb.append(s1);
}
start++;
}
return sb;
}
/**
* 翻转字符串(字符串)
*/
public void reverseString(StringBuilder sb, int start, int end) {
while (start < end) {
char tmp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, tmp);
start++;
end--;
}
}
/**
* 反转单词(双指针)
*/
public void reverseEachWord(StringBuilder sb) {
//遇到空格就进行翻转 start
int start = 0, end = 1;
while (start < sb.length()) {
//遇到空格或者跑到最后一位
while (end < sb.length() &&sb.charAt(end) != ' ' ) {
end++;
}
reverseString(sb, start, end - 1);
start = end + 1;
end = start + 1;
}
}