1. 题目

题目
考查点
这个算法题的考查点是:
- 字符串的处理,如去除空格,分割单词,拼接字符串等。
- 双指针的使用,如左右指针,单词边界指针等。
- 字符串的反转,如整体反转,局部反转等。
2. 解法
思路
这个代码的思路是先去除字符串首尾的空格,然后反转整个字符串,再反转每个单词。这样就可以实现将每个单词逐个翻转的效果。
例如,给定字符串 “the sky is blue”,
- 经过去除空格后得到 “the sky is blue”,
- 反转整个字符串后得到 “eulb si yks eht”,
- 再反转每个单词后得到 “blue is sky the”,就是最终的结果。
代码的思路。这个代码可以分为三个步骤:
- 去除字符串首尾的空格,使得字符串只包含有效的单词和单词之间的空格。
- 反转整个字符串,使得每个单词的顺序颠倒,但是每个单词内部的字符顺序不变。
- 反转每个单词,使得每个单词内部的字符顺序也颠倒,从而实现将每个单词逐个翻转的效果。
具体实现
public String reverseWords(String s) {
s = s.trim(); // 去除首尾空格
StringBuilder sb = new StringBuilder(); // 用于存储结果
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ' && sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {
continue; // 跳过多余的空格
} else {
sb.append(s.charAt(i)); // 添加字符到结果
}
}
int left = 0; // 左指针
int right = sb.length() - 1; // 右指针
while (left < right) {
char tmp = sb.charAt(left); // 交换左右字符
sb.setCharAt(left, sb.charAt(right));
sb.setCharAt(right, tmp);
left++; // 移动左指针
right--; // 移动右指针
}
int boundary = 0; // 单词边界指针
while (boundary < sb.length()) {
left = boundary; // 左指针指向单词开头
while (boundary < sb.length() && sb.charAt(boundary) != ' ') {
boundary++; // 移动边界指针到单词结尾
}
right = boundary - 1; // 右指针指向单词结尾
while (left < right) {
char tmp = sb.charAt(left); // 交换左右字符
sb.setCharAt(left, sb.charAt(right));
sb.setCharAt(right, tmp);
left++; // 移动左指针
right--; // 移动右指针
}
boundary++; // 移动边界指针到下一个单词开头
}
return sb.toString(); // 返回结果字符串
}
浙公网安备 33010602011771号