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个时全部反转」,确实走了弯路,尝试做了一遍,解题思路很简单,就是有点难想到
优质题解
- https://leetcode.cn/problems/reverse-string-ii/solution/fan-zhuan-zi-fu-chuan-ii-by-leetcode-sol-ua7s/
- 字符串操作进阶! | LeetCode:541. 反转字符串II_哔哩哔哩_bilibili
- https://leetcode.cn/problems/reverse-string-ii/solution/gong-shui-san-xie-jian-dan-zi-fu-chuan-m-p88f/
- https://leetcode.cn/problems/reverse-string-ii/solution/jsshua-ti-mian-shi-ti-jie-by-distracted-rjqzw/