# 541 反转字符串 II
# 题目
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
提示:
该字符串只包含小写英文字母。 给定字符串的长度和 k 在 [1, 10000] 范围内。
# 题解
- 使用双指针进行转换位置,然后依次递增比较的位置
TIP
执行用时:88 ms, 在所有 JavaScript 提交中击败了 51.54% 的用户
内存消耗:40.5 MB, 在所有 JavaScript 提交中击败了 15.69% 的用户
内存消耗: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)`,使用常数级别的空间
- 最好情况: 传入空字符,或者传入的字符串较短,则进行较少遍历
- 最坏情况: 传入的字符串较长,则需要进行多次遍历