题目
https://leetcode-cn.com/problems/rotate-array/
方法一
不想看
代码
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
k = k % n;
int count = gcd(k, n);//需要遍历的次数,最大公约数
for (int start = 0; start < count; ++start) {
int current = start;
int prev = nums[start];
do {
int next = (current + k) % n;
int temp = nums[next];
nums[next] = prev;
prev = temp;//prev用来保存被替换掉的
current = next;
} while (start != current);//还没有回到原点
}
}
//求最大公约数
public int gcd(int x, int y) {
return y > 0 ? gcd(y, x % y) : x;
}
}
辗转相除法。这种方法的核心在于不断地用较大的数除以较小的数,直到余数为0(此时较小的数就是最大公约数)。例如,求12和18的最大公约数时,可以先用18除以12得到余数6,然后将12和6作为新的被除数和除数继续计算,直到余数为0,此时6就是12和18的最大公约数。
方法二:数组翻转
爷觉得很妙
分析
代码
class Solution {
public void rotate(int[] nums, int k) {
int len=nums.length;
k=k%len;
reverse(nums,0,len-1);
reverse(nums,0,k-1);
reverse(nums,k,len-1);
}
public void reverse(int[] nums,int i,int j){
while(i<j){
int tmp=nums[i];
nums[i]=nums[j];
nums[j]=tmp;
i++;
j--;
}
}
}