左移和右移字符串

时间:2019-03-13 22:57:09

标签: javascript arrays algorithm for-loop

在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;

}

有什么更好的方法吗?我是编程的新手,正在尝试将算法应用于其中。

4 个答案:

答案 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)
}