微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决反转长字符串中某些字符的算法

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

给定一个字符串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('');
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。