# 541 反转字符串 II

# 题目

给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。

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

示例:

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

提示:

该字符串只包含小写英文字母。 给定字符串的长度和 k 在 [1, 10000] 范围内。

# 题解

  1. 使用双指针进行转换位置,然后依次递增比较的位置

TIP

执行用时:88 ms, 在所有 JavaScript 提交中击败了 51.54% 的用户
内存消耗:40.5 MB, 在所有 JavaScript 提交中击败了 15.69% 的用户
/**
 * @param {string} s
 * @param {number} k
 * @return {string}
 */
var reverseStr = function(s, k) {
  if(!s.length) return s

  s = s.split('')  // 进行拆分
  let count = 0  // 从 0 开始翻转

    // 外层遍历,如果超过,就退出遍历
  while(count<s.length) {
    let left = count // 左指针
    let right = count+k-1 // 右指针

    while(left < right) {
        // 执行转换操作
      [s[left], s[right]] = [s[right], s[left]]
      right--
      left++
    }

    count += 2*k // 每遍历一次,递增
  }

  return s.join('')
};
  • 时间复杂度: `O(n^2)`,使用了嵌套的 while循环
  • 空间复杂度: `O(1)`,使用常数级别的空间
  • 最好情况: 传入空字符,或者传入的字符串较短,则进行较少遍历
  • 最坏情况: 传入的字符串较长,则需要进行多次遍历
最后更新时间: 9/16/2020, 10:53:37 PM