HackerRank leftRotation未通过大型测试案例

时间:2019-04-01 07:59:55

标签: javascript rotation shift

这是hackerRank问题的描述: 对大小为n的数组的左旋转操作将数组元素d的每个元素向左移动。例如,如果对数组[1,2,3,4,5]进行左旋转,则该数组将变为[3,4,5,1,2]。

这是我的功能:

function leftRotation() {
    let newArr = [];
    while (d > 0) {
        let first = data.shift();
        newArr.push(first);
        d--;
    }
    return [...data, ...newArr];
   }

但是它没有通过大型测试用例,例如n = 73000,d = 60000,

提前感谢任何想法。

3 个答案:

答案 0 :(得分:1)

我不确定这种方法的性能,但可以在一行中完成。

function leftRotation(arr, d) {
    return [ ...arr.slice(d), ...arr.slice(0, d) ];
}

console.log(leftRotation([1, 2, 3, 4, 5], 2));

答案 1 :(得分:0)

请勿旋转N次。移位to_json次,因为假设您有一个N % (length of array)个项目的数组,并且要求将其移位5次,则基本上不必移位一次。

5

编辑:

您可以使用类似的逻辑来优化代码,而不是优化数组中的Start : [1, 2, 3, 4, 5] 1: [2, 3, 4, 5, 1] 2: [3, 4, 5, 1, 2] 3: [4, 5, 1, 2, 3] 4: [5, 1, 2, 3, 4] 5: [1, 2, 3, 4, 5] 元素。例如:对于actually shifting,可以用N = 73000, D = 60000 splice数组,然后只需将返回的拼接数组附加到现有数组中并返回它。

答案 2 :(得分:0)

  • 对于数组arr,方法shift()的时间复杂度为O(arr.length)
  • 如果d大于n,则您仍然执行shift() d次。
  • 总的来说,您的时间复杂度可能上升到O(d * arr.length),这肯定太长了。

但是,这个问题可以在O(arr.length)的时间和空间中解决。如果您知道d,则可以轻松地将每个项目向左移动d个位置。例如,arr.length = 5d = 2

position:        0 1 2 3 4
     arr:        4 3 5 1 6              

position in arr: 2 3 4 0 1  
shifted_arr:     5 1 6 4 3                

实际上,移位数组中位置i上的每个项目都对应于原始数组(i + d) % arr.length中位置arr上的一个项目。因此,代码如下所示:

function leftShift(arr, d) {
    let newArr = [];
    let size = arr.length;
    
    for (var i = 0; i < size; i++) {
        newArr.push(arr[(i + d) % size]);
    }
    
    return newArr;
}

console.log(leftShift([4, 3, 5, 1, 6], 2))