541-反转字符串II
标签:双指针 字符串
题目信息
题目地址: 541. 反转字符串 II
题目内容:
javascript
给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
提示:
1 <= s.length <= 104
s 仅由小写英文组成
1 <= k <= 104
题解
解法一
思路:
从字符串开头开始遍历,遍历索引为
i
判断
i + k 是否 <= s.length
如果成立则符合
剩余字符小于2k但大于或等于k个,则反转前k个字符,其余字符保持原样
如果不成立则符合
剩余字符少于k个,则将剩余字符全部反转
反转后然后将
i += 2k
,i
每次加上2k
,直到遍历完字符串
代码实现:
javascript
/**
* @param {string} s
* @param {number} k
* @return {string}
*/
var reverseStr = function(s, k) {
const reverseStr = (str, start, end) => {
const targetStrArr = str.substring(start, end).split('')
let left = 0, right = targetStrArr.length
while(left < right) {
[targetStrArr[left], targetStrArr[right]] = [targetStrArr[right], targetStrArr[left]]
left++
right--
}
return `${str.substring(0, start)}${targetStrArr.join('')}${str.slice(end)}`
}
for(let i = 0; i < s.length; i += k * 2) {
// 先反转2k个中的前k个
if(i + k <= s.length) {
s = reverseStr(s, i, i + k)
continue
}
// 剩余字符少于 k 个,则将剩余字符全部反转
s = reverseStr(s, i, s.length)
}
return s
};