在 Hackerrank 上,我遇到了这个问题。我有一个接受 3 个参数的函数。
示例 --> function shiftStrings("string", leftShifts, rightShifts);
LeftShifts 和 rightShifts 是整数。
左移:字符串的单个循环旋转,其中第一个字符成为最后一个字符,所有其他字符向左移动一个索引。例如,abcde 左移一次后变为 bcdea,左移两次后变为 cdeab。
右移:字符串的单个循环旋转,其中最后一个字符成为第一个字符,所有其他字符向右移动。例如,abcde 右移一次后变为 eabcd,右移两次后变为 deabc。
我通过了 13 个测试用例中的 7 个,但其他五个超时。这是我的解决方案
function getShiftedString(s, leftShifts, rightShifts) {
// Write your code here
let arr = s.split('');
for (let i = 0; i < leftShifts; i++) {
let arrItem = arr[0];
arr.shift();
arr.push(arrItem);
};
for (let i = 0; i < rightShifts; i++) {
let arrItem = arr[arr.length - 1];
arr.pop();
arr.unshift(arrItem);
};
const finished = arr.join('');
return finished;
}
关于更好的方法的任何想法?我对编程和尝试进行算法练习比较陌生。
最佳答案
使用 slice
(它可以接受负指数)可能会更容易,并且最初计算净位移,因此只需要进行一个实际的位移操作:
function getShiftedString(s, leftShifts, rightShifts) {
// using `split('')` will result in certain unicode characters being separated incorrectly
// use Array.from instead:
const arr = Array.from(s);
const netLeftShifts = (leftShifts - rightShifts) % arr.length;
return [...arr.slice(netLeftShifts), ...arr.slice(0, netLeftShifts)]
.join('');
}
console.log([
getShiftedString('abc', 0, 0),
getShiftedString('abc', 1, 0),
getShiftedString('abc', 0, 1),
getShiftedString('abc', 1, 1),
getShiftedString('123456789', 0, 0),
getShiftedString('123456789', 1, 5),
getShiftedString('123456789', 5, 1),
'----',
getShiftedString('123456789', 9, 0),
getShiftedString('123456789', 10, 0),
getShiftedString('123456789', 0, 9),
getShiftedString('123456789', 0, 10),
getShiftedString("🐎👱❤", 0, 0),
getShiftedString("🐎👱❤", 1, 0),
]);
关于javascript - Shift 字符串 左右循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55152391/