为什么Javascript Array #shift或Array#slice会导致性能问题?

时间:2016-09-21 02:48:49

标签: javascript arrays performance

我一直在解决a hacker rank problem。它的想法是“向左”移动元素在第一个索引n次。问题是我的算法收到一个大型数组。在Hacker Rank服务器中产生超时问题。我不明白这个问题背后的问题。 有人知道发生了什么吗?

我尝试了两个想法

示例输入

5 4
1 2 3 4 5

示例输出

5 1 2 3 4

创意1

function processData(input) {
    var input_arguments = input.split(/\n/),
        rotations_count = parseInt(input_arguments[0].split(/\s/)[1],10),
        array = input_arguments[1].split(/\s/);

    while(rotations_count--){
        let value = array[0];
        array = array.slice(1);
        array.push(value);
    }
    console.log(array.join(' '));
} 

Idea2

function processData(input) {
    var input_arguments = input.split(/\n/),
        rotations_count = parseInt(input_arguments[0].split(/\s/)[1],10),
        array = input_arguments[1].split(/\s/);

    while(rotations_count > 0){
        array.push(array.shift());
        rotations_count--;
    }
    console.log(array.join(' '));
}

1 个答案:

答案 0 :(得分:0)

您正在尝试逐个进行轮班,但一个有效的解决方案可以一次性完成一次大转变。 "问题"你失踪的是,轮班的次数告诉你你可以在阵列中的哪个位置"切断它"分成两部分,然后你可以把第一部分添加到第二部分的末尾。使用他们的例子:

let array = [1, 2, 3, 4, 5];
let shifts = 4;

// Create a temp array holding the values of 'array' up the shift point
let temp = array.slice(0, shifts);

// Delete the beginning of 'array' up to shift point
// and add the temp array to the end of 'array'
let newArray = array.splice(shifts).concat(temp);

这就是它的全部内容。