源地址
https://app.codility.com/programmers/lessons/2-arrays/cyclic_rotation/
CyclicRotation(周期旋转)
给定一个包含N个整数的数组A。数组的旋转的意思是每一个元素往右移动一格,并且最后一个元素被移动到第一个。比如,数组A「3,8,9,7,6」的旋转是「6,3,8,9,7」(元素往右移动一格,并且6被移动到第一个。)
目标是旋转k次数组A,也就是A中的每个元素都会被移动k次。
写一个函数:
class Solution {
public int[] solution(int[] A, int K);
}
给定一个包含N个整数的数组A和一个整数K,返回旋转了K次的数组A。
比如,给定
A = [ 3 , 8 , 9 , 7 , 6 ]
K = 3
这个函数应该返还 [ 9 , 7 , 6 , 3 , 8 ] 。做了3次旋转
[3, 8, 9, 7, 6] -> [6, 3, 8, 9, 7]
[6, 3, 8, 9, 7] -> [7, 6, 3, 8, 9]
[7, 6, 3, 8, 9] -> [9, 7, 6, 3, 8]
另一个例子,给定
A = [ 0 , 0 , 0 ]
K = 1
这个函数返回 [ 0 , 0 , 0 ]
给定
A = [ 1 , 2 , 3 , 4 ]
K = 4
这个函数返回 [ 0 , 0 , 0 ]
假设:
- N和K是在[ 0 , 100 ]范围内的整数
- 数组A中的每个元素都是在[ -1000 , 1000 ]范围内的整数
在你的解决方案中,应该聚焦于正确性,而不是效率。
第一步
其实是一个取模的问题。当k等于数组长度的时候,每个数字都会移动回其原来的位置。当不等的时候,移动的位置就是k对数组长度取余。
public int[] solution(int[] A, int K) {
int len = A.length;
if (len < 2 || K % len == 0) {
return A;
}
int[] result = new int[len];
int distance = K % len;
for (int i = 0; i < len; i++) {
result[(i + distance) % len] = A[i];
}
return result;
}