【LeetCode】541.反转字符串 II

欢迎来到李耶的频道【LeetCode面试题】。


反转字符串 II

🔗 LeetCode 原题链接

题目

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。

  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

    输入:s = "abcdefg", k = 2
    输出:"bacdfeg"

    输入:s = "abcd", k = 2
    输出:"bacd"

提示:

  • 1 <= s.length <= 10^4
  • s 仅由小写英文组成
  • 1 <= k <= 10^4

解法一:分段模拟(推荐)

思路 :使用 for 循环以 2k 为步长遍历字符串,每次处理一个长度为 2k 的区间。对区间的前 k 个字符进行反转,末尾不足 k 的则全部反转。

javascript 复制代码
function reverseStr(s, k) {
  const arr = s.split('');
  const n = arr.length;

  for (let i = 0; i < n; i += 2 * k) {
    // 确定反转的右边界:i+k 与 n 取较小值
    let left = i;
    let right = Math.min(i + k - 1, n - 1);

    // 双指针反转
    while (left < right) {
      [arr[left], arr[right]] = [arr[right], arr[left]];
      left++;
      right--;
    }
  }

  return arr.join('');
}
  • 时间复杂度 / 空间复杂度:O(n) / O(n)
  • 优势:逻辑清晰,一次遍历即可完成,是面试中最推荐的写法

解法二:库函数法

思路 :同样以 2k 为步长遍历,借助语言内置的 reverse 方法简化代码。用 substring 取出目标片段,反转后拼回。

javascript 复制代码
function reverseStr(s, k) {
  let result = '';

  for (let i = 0; i < s.length; i += 2 * k) {
    // 前半段:反转前 k 个(或剩余全部)
    const part1 = s.substring(i, i + k);
    const reversed = part1.split('').reverse().join('');

    // 后半段:保持不变
    const part2 = s.substring(i + k, i + 2 * k);

    result += reversed + part2;
  }

  return result;
}
  • 时间复杂度 / 空间复杂度:O(n) / O(n)
  • 优势:代码简洁,利用库函数减少手动操作
  • 劣势:多次拼接字符串可能产生额外开销

解法对比

解法 时间 / 空间复杂度 优势 推荐指数
分段模拟 O(n) / O(n) 手动实现,面试加分 ⭐⭐⭐⭐⭐
库函数法 O(n) / O(n) 代码简洁,易于编写 ⭐⭐⭐⭐

扩展题

  1. 反转字符串:编写一个函数,将输入的字符串原地反转。
  2. 反转字符串中的单词 III:给定一个字符串,反转每个单词的字符顺序,同时保留空格和单词顺序。
  3. 反转字符串中的元音字母:编写一个函数,反转字符串中的元音字母。

"行远自迩,登高自卑。" ------ 《礼记·中庸》

关注李耶,每天一道面试题,一起卷起来 🔥

相关推荐
hetao173383713 分钟前
2026-09-13 hetao1733837 的刷题记录
c++·算法
hansang_IR20 分钟前
【题解】[JSOI2016] 扭动的回文串
c++·算法
Lyyaoo.21 分钟前
【二分查找】【困难】寻找两个有序数组的中位数
java·数据结构·算法
程序员杰哥1 小时前
UI自动化测试:Jenkins配置
自动化测试·软件测试·python·测试工具·职场和发展·jenkins·测试用例
kevin_kang1 小时前
第05章 实时语音识别的 ASR 原理
算法
kevin_kang1 小时前
第04章 断句原理:本地 VAD 与神经网络 VAD
算法
kevin_kang1 小时前
第06章 文字转语音的 TTS 原理
算法
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 123. 买卖股票的最佳时机 III | C++ 状态机动态规划与通用交易拓展
c++·算法·leetcode
luj_17681 小时前
生物体如何应对功能击穿?
c语言·开发语言·c++·经验分享·算法
luj_17681 小时前
击穿分析五大关键步骤
开发语言·网络·c++·经验分享·算法