题目链接:https://leetcode.cn/problems/rotate-array/description/?envType=study-plan-v2&envId=top-100-liked
使用额外数组
向右轮转k个位置后下标为:(i + k) % n
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
//额外的数组
int[] ans = new int[n];
for(int i = 0; i < n; i++){
//轮转后的下标
ans[(i + k) % n] = nums[i];
}
//将数组ans从索引0开始的n个元素复制到数组nums中从索引0开始的位置,n是要复制的数量
System.arraycopy(ans, 0, nums, 0, n);
}
}
最大公因数和最小公倍数
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
//k为n的倍数就等于不动
k = k % n;
//求k和n的最大公约数,即遍历的次数
int cnt = gcd(k, n);
for(int i = 0; i < cnt; i++){
//当前的次数
int cur = i;
//当前位置的元素
int pre = nums[i];
do{
//下一个位置下标
int next = (cur + k) % n;
//暂时存储下一个位置的元素
int t = nums[next];
//下一个位置为当前位置轮转后的元素
nums[next] = pre;
//当前位置存储下一个位置元素
pre = t;
//当前下标为下一个位置下标
cur = next;
}while(i != cur); //转了一圈就退出
}
}
public int gcd(int a, int b){
return b > 0 ? gcd(b, a % b) : a;
}
}
数组翻转
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
k = k % n;
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
}
public void reverse(int[] nums, int st, int ed){
while(st < ed){
int t = nums[st];
nums[st] = nums[ed];
nums[ed] = t;
st++;
ed--;
}
}
}
还剩85题!