反转长字符串中某些字符的算法

问题描述

我目前正在研究一个编程问题:

给定一个字符串s一个整数k,每2k个字符反转前k个字符从字符串的开头开始计数。

如果剩余少于 k 个字符,则将它们全部反转。如果少于 2k 个但大于或等于 k 个字符,则将前 k 个字符倒置,其他保持原来的。

我创建了一个程序来解决 60 个测试用例中的前 45 个,但显然在非常长的字符串上失败了。当输入 999 个字符的字符串时,最后几个是无意义的。

我在我的代码中看不到任何可能导致该错误错误。任何反馈?简单的解决方案还是构建代码的更好方法

function reverseArrayOfChars(sArray) {
  const length = sArray.length;
  let temp;
  for (let s = 0; s < length / 2; s++) {
    temp = sArray[s];
    sArray[s] = sArray[length - 1 - s];
    sArray[length - 1 - s] = temp;
  }
  return sArray;
}

function reverseStr(s,k) {
  let sArray = s.split("");
  let newArray = []; //Final array to be returned
  let tempArray = []; //tempArray is used to store returns from reverseArrayOfChars function. These returns are then concatenated onto newArray.
  let switchBoard = 1; //Used to 'switch' between two conditions. Changes automatically every iteration of the loop.
  for (let counter = 0; counter < sArray.length; counter += k) {
    switchBoard = switchBoard === 0 ? 1 : 0;
    if (sArray.length - counter < k) {
      tempArray = reverseArrayOfChars(sArray.slice(counter));
      newArray = newArray.concat(tempArray);
      break;
    } else if (sArray.length - counter > k && sArray.length < k * 2) {
      tempArray = reverseArrayOfChars(sArray.slice(counter,counter + k));
      newArray = newArray.concat(tempArray);
      tempArray = sArray.slice(counter + k);
      newArray = newArray.concat(tempArray);
      break;
    } else if (switchBoard === 0) {
      tempArray = reverseArrayOfChars(sArray.slice(counter,counter + k));
      newArray = newArray.concat(tempArray);
    } else if (switchBoard === 1) {
      tempArray = sArray.slice(counter,counter + k);
      newArray = newArray.concat(tempArray);
    }
  }
  return newArray.join("");

解决方法

或者,您可以尝试以下示例代码:

var reverseStr = function(s,k) {
    if (k > s.length) 
        return s.split('').reverse().join('');
    
    const split = s.split('');
    
    // reverse the seg. then join it back
    for (let i = 0; i < s.length; i += 2*k) {
        const reverse = split.splice(i,k).reverse();
        split.splice(i,...reverse);
    }
    
    return split.join('');
};