欢迎来到李耶的频道【LeetCode面试题】。
反转字符串中的单词 III
题目
给定一个字符串 s,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
输入:s = "God Ding"
输出:"doG gniD"
注意: 在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
解法一:双指针原地反转(推荐)
思路 :将字符串转为字符数组,遍历数组,用 start 记录每个单词的起始索引。遇到空格或到达字符串末尾时,对当前单词进行双指针原地反转。
javascript
function reverseWords(s) {
const arr = s.split('');
let start = 0;
for (let i = 0; i <= arr.length; i++) {
// 遇到空格或到达末尾,反转当前单词
if (i === arr.length || arr[i] === ' ') {
let left = start;
let right = i - 1;
while (left < right) {
[arr[left], arr[right]] = [arr[right], arr[left]];
left++;
right--;
}
start = i + 1; // 指向下一个单词的起始位置
}
}
return arr.join('');
}
- 时间复杂度 / 空间复杂度:O(n) / O(n)(字符数组额外空间)
- 优势:一次遍历,原地反转,面试中最推荐的写法
解法二:分割反转法(库函数)
思路:按空格分割字符串得到单词数组,对每个单词反转字符顺序,再用空格重新拼接。
javascript
function reverseWords(s) {
return s
.split(' ')
.map(word => word.split('').reverse().join(''))
.join(' ');
}
- 时间复杂度 / 空间复杂度:O(n) / O(n)
- 优势:代码极其简洁,一行搞定
- 劣势:多次创建中间数组,面试中可作为快速解法展示
解法对比
| 解法 | 时间 / 空间复杂度 | 优势 | 推荐指数 |
|---|---|---|---|
| 双指针原地反转 | O(n) / O(n) | 手动实现,面试加分 | ⭐⭐⭐⭐⭐ |
| 分割反转法 | O(n) / O(n) | 代码简洁,易于编写 | ⭐⭐⭐⭐ |
扩展题
- 反转字符串:编写一个函数,将输入的字符串原地反转。
- 反转字符串 II :给定一个字符串
s和一个整数k,从开头起每隔2k个字符,反转前k个字符。 - 反转字符串中的单词:给定一个字符串,反转字符串中单词的顺序。
"他山之石,可以攻玉。" ------ 《诗经·小雅·鹤鸣》
关注李耶,每天一道面试题,一起卷起来 🔥