Skip to content

541. 反转字符串 II

解题过程

INFO

题目链接 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样

javascript
/**
 * @link https://leetcode.cn/problems/reverse-string-ii/
 * @title 541. 反转字符串 II
 * @description 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
 * 如果剩余字符少于 k 个,则将剩余字符全部反转。
 * 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样
 * @param {string} s
 * @param {number} k
 * @return {string}
 */
// 解题一
// 思路:笨方法:穷举所有情况
// 第一步:将字符串看作按照double_k切分好的字符串数组,计算循环数组的次数
// 第二步:只考虑最后一次循环和其他循环情况处理字符串根据条件反转即可
var reverseStr = function (s, k) {
  const double_k = 2 * k
  let res = '' // 返回值
  // 将字符串看作分割double_k个片段数组处理(向上取整)
  let loop = Math.ceil(s.length / double_k)
  let count = 0 // 计数

  while (loop--) {
    if (loop === 0) {
      // 最后一个数组字符片段
      const str = s.slice(count)

      if (str.length < k) {
        const newStr = str.split('').reverse().join('')
        res += newStr
      } else {
        const frontStr = str.slice(0, k).split('').reverse().join('')
        const behindStr = str.slice(k)
        res += frontStr + behindStr
      }
    } else {
      // 2k字符
      const str = s.slice(count, count + double_k)
      const frontStr = str.slice(0, k).split('').reverse().join('')
      const behindStr = str.slice(k)
      res += frontStr + behindStr
    }

    count += double_k
  }

  return res
}

// 解法二
// 思路:来自评论区的灵感解答:每隔K个反转K个字符,末尾不够K个时全部反转
var reverseStr = function (s, k) {
  const len = s.length
  let resArr = s.split('')
  for (let i = 0; i < s.length; i += 2 * k) {
    let left = i - 1
    let right = i + k > len ? len : i + k
    while (++left < --right) {
      [resArr[left], resArr[right]] = [resArr[right], resArr[left]]
    }
  }

  return resArr.join('')
}

const result = reverseStr('abcdefg', 2) // bacdfeg
// const result = reverseStr('abcd', 2) // bacd
// const result = reverseStr('a', 2) // a
// const result = reverseStr("hyzqyljrnigxvdtneasepfahmtyhlohwxmkqcdfehybknvdmfrfvtbsovjbdhevlfxpdaovjgunjqlimjkfnqcqnajmebeddqsgl", 39) // "cbad"
console.log(result)

解题感受

自己用了穷举法做出来的,感觉有点笨方法,但还好做出来的,看了评论区有一个解题思路很轻便:「来自评论区的灵感解答:每隔K个反转K个字符,末尾不够K个时全部反转」,确实走了弯路,尝试做了一遍,解题思路很简单,就是有点难想到

优质题解