Leetcode:541. 反转字符串II

208 阅读1分钟

力扣题目链接

题意:

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

image.png

/**
 * @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值就直接取到数组的长度就可以了