leetcode 541题

Posted by franki on November 11, 2022

leetcode 541 反转字符串 II

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

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

示例1

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例2

输入:s = "abcd", k = 2
输出:"bacd"

思路

先把字符串转换为数组,遍历这个数组,在里面获取要反转的数组前后下标,得到之后,不断反转两个下标区间的元素,遍历结束,便可获取结果。

代码

/**
 * @param {string} s
 * @param {number} k
 * @return {string}
 */
var reverseStr = function(s, k) {
    const n = s.length;
    const arr = Array.from(s);

    for (let i = 0; i < n; i += 2 * k) {
        reverse(arr, i, Math.min(i + k, n) - 1);
    }

    return arr.join('');
};

function reverse(arr, left, right) {
    while (left < right) {
        [arr[left], arr[right]] = [arr[right], arr[left]];
        left++;
        right--;
    }
}

复杂度分析:

  • 时间复杂度: O(N)
  • 空间复杂度:O(N)