跳到主要内容

字符串反转

如何原地反转一个字符数组?​

  • 方法: 左右两个指针向中间靠拢, 交换两端的字符;
  • 终止: left >= right;
  • 复杂度: 时间 O(n), 空间 O(1);
function reverseString(s: string[]): void {
let left = 0;
let right = s.length - 1;
while (left < right) {
[s[left], s[right]] = [s[right], s[left]];
left++;
right--;
}
}

如何反转句子中单词的顺序?​

  • 目标: 反转单词的先后顺序, 单词内部的字符顺序不变, 并去掉多余空格;
  • 简洁做法: 先按空白切分成单词数组, 再反转数组并重新拼接;
  • 细节: split(/\s+/) 把连续空白视为一个分隔符;
function reverseWords(s: string): string {
return s.trim().split(/\s+/).reverse().join(" ");
}
  • 手动做法: 逐字符扫描收集单词, 再交换单词数组两端, 空间开销更低;
  • 复杂度: 简洁做法时间 O(n)、空间 O(n);

如何只反转每个单词内部的字符?​

  • 目标: 单词的先后顺序不变, 每个单词内部的字符反转;
  • 做法: 按空格切分, 把每个单词转成字符数组反转后再拼回;
function reverseWordsInWord(s: string): string {
return s
.split(" ")
.map((word) => word.split("").reverse().join(""))
.join(" ");
}
  • 复杂度: 时间 O(n), 空间 O(n);