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

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

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

相关推荐
AI备案指南-满满2 小时前
人工智能拟人化互动服务安全自评估报告的评估要点有哪些?
人工智能·算法·安全·机器人·大模型备案·算法备案
土司大王4 小时前
LeetCode hot100——两两交换链表中的节点
算法·leetcode·职场和发展
大熊背5 小时前
树莓派IspPipeline LSC模块原理详解
算法·lsc·isppipeline·mesh lsc
测试19985 小时前
Selenium 无法定位元素的几种解决方案
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
zander2585 小时前
LeetCode 300. 最长递增子序列
算法·leetcode·深度优先
欧叶冲冲冲6 小时前
Python常见数据结构的CRUD(LeetCode高频版速查)
数据结构·python·leetcode
祖力556 小时前
Linux应用软件编程:目录IO与framebuffer
linux·运维·算法·framebuffer·目录io
名字还没想好☜6 小时前
Go 用 slices/maps 标准库泛型函数:告别手写 Contains、Sort、去重(Go 1.21)
开发语言·后端·算法·golang·go
地平线开发者6 小时前
【模型轻量化专题】深度学习模型为什么需要轻量化
算法
圣保罗的大教堂6 小时前
leetcode 3622. 判断整除性 简单
leetcode