在Hackerrank上,我遇到了这个问题。我有一个带有3个参数的函数。 示例->函数shiftStrings(“ string”,leftShifts,rightShifts); LeftShifts和rightShifts是整数。
左移:字符串的单个循环旋转,其中第一个字符变为最后一个字符,而所有其他字符向左移动一个索引。例如,左移一格后,abcde变为bcdea,左移两格后,abcde变为cdeab。
右移:字符串的单个循环旋转,其中最后一个字符变为第一个字符,而所有其他字符向右移位。例如,abcde右移后变为eabcd,两次右移后变为deabc。
我通过了13个测试用例中的7个,但是其他5个超时了。这是我的解决方法
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;
}
有什么更好的方法吗?我是编程的新手,正在尝试将算法应用于其中。
答案 0 :(得分:1)
使用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),
]);
答案 1 :(得分:0)
这是我使用拼接和扩展运算符进行左移和右移的解决方案。
//left
let str="abcde";
let arr=Array.from(str);
let left_shift=2;
let x=arr.splice(0, left_shift);
console.log([...arr,x].flat().join(""));
//right
let arr1=Array.from(str).reverse();
let right_shift=2;
let x1=arr1.splice(0, right_shift);
console.log([...arr1,x1].flat().reverse().join(""));
答案 2 :(得分:0)
我一直在研究相同的问题...您可以改用此代码。我用过科特林。
fun getShiftedString(s: String, leftShifts: Int, rightShifts: Int): String {
// Write your code here
var result = "" ;
val l = s.length ;
var d =(leftShifts-rightShifts)%l ;
if (d==0){
result = s ;
}
else{
if(d>0){
result = s.substring(d) + s.substring(0,d) ;
}
else{
result = s.substring(l + d) + s.substring(0,l + d) ;
}
}
return result ;
}
答案 3 :(得分:0)
这是我的JavaScript解决方案
function getShiftedString(s, leftShifts, rightShifts) {
s = getLeftShift(s, leftShifts);
return getRightShift(s, rightShifts);
}
function getLeftShift(s, leftShifts) {
leftShifts = leftShifts % s.length;
return s.slice(leftShifts) + s.slice(0, leftShifts);
}
function getRightShift(s, rightShifts) {
return getLeftShift(s, -rightShifts)
}