题意:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
/**
* @param {string} s
* @param {number} k
* @return {string}
*/
var reverseStr = function(s, k) {
let arr = s.split('')
const n = arr.length
for(let i=0;i<n;i+=2*k){
let left = i
let right = Math.min(i+k,n)-1
while(left<right){
[arr[left],arr[right]]=[arr[right],arr[left]]
left++
right--
}
}
return arr.join('')
};
- 总体的思路就是来反转某个区间的所有字符串,但问题是如何确定区间
- 根据题意,一共有三种情况:
- 每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 前两种情况其实是一样的,即使剩下的字符不够2k个,但只要大于k个,它就能反转前k个字符。所以我们每次反转字符的区间都在[i,i+k]里
- 第三种情况,当我们剩余的字符不够k个时,我们的right值就直接取到数组的长度就可以了