我的数组轮换算法出了什么问题?

时间:2016-07-12 19:00:46

标签: javascript arrays algorithm

我正在研究Codility的挑战,将数组旋转k次。我提出了这个理论上应该有效的解决方案,但实际上只有25%的分数。

问题陈述

  

给出了由N个整数组成的零索引数组A.旋转   数组意味着每个元素右移一个索引,并且   数组的最后一个元素也移到了第一位。

     

例如,数组A = [3,8,9,7,6]的旋转是[6,3,8,9,   7]。目标是旋转阵列A K次;也就是说,A的每个元素   将被K指数向右移动。

     

写一个函数:

     

功能解决方案(A,K);

     

给定零索引数组A由N个整数和一个整数组成   整数K,返回数组A旋转K次。

     

例如,给定数组A = [3,8,9,7,6]和K = 3,函数   应该返回[9,7,6,3,8]。

     

假设:

     

•N和K是[0..100]范围内的整数; •每个元素   数组A是[-1,000..1,000]范围内的整数。

function solution(A, K) {
    for (var i = 1; i < K; i++) {
        A.push(A.shift());
    }
    return A;
}

变量A表示数组,变量K表示所需的旋转数。

要将元素添加到数组的末尾,请使用push函数。而shift函数删除了数组的第一个元素。这看起来就像轮换一样。

**测试结果**

empty-array:传递

单个:一个元素(0 <= k <= 5):通过

double:两个元素(k <= n):失败

small1:失败

small2:失败

最大:最大n和k:失败

3 个答案:

答案 0 :(得分:1)

K1时,您的循环未输入。当K2时,您的循环会迭代一次而不是两次。我会将var i = 1更改为var i = 0以使其迭代K次,但如果您愿意,也可以将< K更改为<= K

答案 1 :(得分:1)

您的代码中有两个错误:

  • 您的循环仅执行K-1次,因此仅将阵列移位K-1而不是K次
  • 您向左移动,但要求声明您应该向右移动。

如何解决这个问题?

  • i = 0而不是i = 1开始循环以转换K次
  • 使用unshiftpop代替pushshift来改变方向。

您的固定代码:

function solution(A, K) {
    for (var i = 0; i < K; i++) {
        A.unshift(A.pop());
    }
    return A;
}

A&#34;真实世界&#34;解决方案可能如下所示:

function rotateRight(a, k) {
    k %= a.length;
    return a.slice(-k).concat(a.slice(0, -k));
}

答案 2 :(得分:0)

对@ie_m解决方案进行了一些细微修改(使用大写和solution来保持Codility满意,如果K mod A.length == 0,则仅返回数组):

function solution(A, K) {
    K %= A.length;
    if (K === 0) {
        return A;
    } else {
        return A.slice(-K).concat(A.slice(0, -K));
    }
}