问题描述
我目前正在研究一个编程问题:
给定一个字符串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('');
};