【问题标题】:Shift strings Circular left and rightShift 字符串 循环左右
【发布时间】:2019-08-04 18:00:02
【问题描述】:

在 Hackerrank 我遇到了这个问题。我有一个接受 3 个参数的函数。 示例 --> function shiftStrings("string", leftShifts, rightShifts); LeftShifts 和 rightShifts 是整数。

左移:字符串的单次循环旋转,其中第一个字符变为最后一个字符,所有其他字符向左移动一个索引。例如,abcde 左移一次后变为 bcdea,左移两次后变为 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;

}

有什么更好的方法来做到这一点吗?我对编程和尝试进行算法练习比较陌生。

【问题讨论】:

  • 嗯,一个优化是rightShifts - leftShifts,下一个优化只是两个单片,.. 例如.. abcdef左移2可以是cdef + ab,只有2个简单的字符串切片的..哦,您可能想要对班次进行模数,例如。长度为 5 的字符串左移 6 次与左移 1 次相同。

标签: javascript arrays algorithm for-loop


【解决方案1】:

这是我的 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)
}

【讨论】:

    【解决方案2】:

    我正在研究同样的问题...您可以改用此代码。我用过 kotlin。

    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】:

      使用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),
      ]);

      【讨论】:

      • 漂亮的答案!
      【解决方案4】:

      这是我使用拼接和扩展运算符进行左移和右移的解决方案。

         //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(""));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 2015-04-21
        • 1970-01-01
        • 2019-04-28
        • 2014-03-28
        相关资源
        最近更新 更多