【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. 反转字符串中的元音字母:编写一个函数,反转字符串中的元音字母。

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

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

相关推荐
企业数字化笔记15 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!16 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小郎君65819 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧19 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
hold?fish:palm19 小时前
40 二叉树的直径
c++·leetcode
Shimeri19 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J20 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang20 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
爱读书的小胖20 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy20 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化