繁体   English   中英

我的阵列旋转算法出了什么问题?

[英]What's wrong with my array rotation algorithm?

我正在研究Codility,以应对将数组旋转k次的挑战。 我想出了这个解决方案,该解决方案在理论上应该可行,但实际上仅获得25%的分数。

问题陈述

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

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

编写一个函数:

函数解(A,K);

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

例如,给定数组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函数将删除数组的第一个元素。 这似乎是一种轮换。

** 检测结果**

空数组:已通过

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

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

small1:失败

small2:失败

最大值:最大值n和k:失败

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

您的代码中有两个错误:

  • 您的循环仅执行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;
}

“现实世界”的解决方案可能如下所示:

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

对@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));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM