今天我们来拆解力扣第151题"反转字符串中的单词"。这是一道经典的字符串处理题目,看似简单但暗藏玄机。题目要求我们将字符串中的单词顺序反转,同时去除多余的空格。
给定一个字符串s,我们需要:
例如:
输入:" hello world "
输出:"world hello"
最直观的解法可以分为三步:
这种解法的时间复杂度是O(n),空间复杂度也是O(n),因为需要存储分割后的单词数组。
让我们深入分析提供的Java解法代码:
java复制class Solution {
public String reverseWords(String s) {
s = s.trim();
String[] arr = s.split("\\s+");
List<String> wordList = Arrays.asList(arr);
StringBuilder sb = new StringBuilder();
// 从后往前遍历数组
for (int i = arr.length - 1; i >= 0; i--) {
sb.append(arr[i]);
// 除了最后一个单词,其余单词后加空格
if (i > 0) {
sb.append(" ");
}
}
return sb.toString();
}
}
s.trim():去除字符串首尾空格s.split("\\s+"):按一个或多个连续空格分割字符串注意:正则表达式中的
\s+表示匹配一个或多个空白字符(包括空格、制表符等)
代码注释中提供了另一种实现方式:
java复制Collections.reverse(wordList);
return String.join(" ", wordList);
这种写法更简洁,但实际性能差异不大。String.join内部也是使用StringBuilder实现的。
测试用例要包含:
打印中间结果:
java复制System.out.println(Arrays.toString(arr)); // 查看分割结果
特别要注意以下边界情况:
在实际编码中,我发现以下几点特别重要:
\s+比单纯的空格更健壮对于Java开发者来说,熟练掌握String的各种方法(trim、split等)和集合工具类(Arrays、Collections)能大幅提高编码效率。这道题虽然简单,但很好地考察了对字符串处理基本功的掌握程度。