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(); // 返回结果字符串 }