我正在研究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:失败
答案 0 :(得分:1)
当K
为1
时,您的循环未输入。当K
为2
时,您的循环会迭代一次而不是两次。我会将var i = 1
更改为var i = 0
以使其迭代K
次,但如果您愿意,也可以将< K
更改为<= K
。
答案 1 :(得分:1)
您的代码中有两个错误:
如何解决这个问题?
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;
}
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));
}
}