[英]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:失败
当K
为1
不会进入循环。 当K
为2
循环迭代一次,而不是两次。 我会将var i = 1
更改为var i = 0
以使其迭代K
次,但是如果您愿意,也可以将< K
更改为<= K
。
您的代码中有两个错误:
如何解决这个问题?
i = 0
而不是从i = 1
开始循环以移位K次 unshift
和pop
而不是push
和shift
来反转方向。 您的固定代码:
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.