方法一:数组进行k轮的移动,每轮移动将最后的元素到最前面
①:每轮(第二个for)是整体往后移动一位
class Solution {//三次移动
public void rotate(int[] nums, int k) {
int n=nums.length;
for(int i=0;i<k;i++){//共三轮
int temp=nums[n-1];//保存最后一个元素
for(int j=n-1;j>0;j--){//每轮往后移一位
nums[j]=nums[j-1];
}
nums[0]=temp;
}
}
}
②每轮(第二个for)通过与最后一位交换实现把最后一个元素交换到第一个元素,并且保证其他顺序不变。
class Solution {
public void rotate(int[] nums, int k) {
int pre,temp;
for(int i=0;i<k;i++){
pre=nums[nums.length-1];
for(int j=0;j<nums.length;j++) {
temp=nums[j];
nums[j]=pre;
pre=temp;
}
}
}
}
方法二:三次反转(双指针)
class Solution {
public void rotate(int[] nums, int k) {
int n=nums.length;
k%=n;//轮转超过长度
reverse(nums,0,n-k-1);
reverse(nums,n-k,n-1);
reverse(nums,0,n-1);}
public void reverse(int[] nums, int left, int right){
while(left<right){
int temp =nums[left];
nums[left]=nums[right];
nums[right]=temp;
left++;
right--;
}
}
}
方法三: 新建数组存储轮转后的结果,再赋给原数组
其中(i+k)%length很巧妙
class Solution {
public void rotate(int[] nums, int k) {
int length = nums.length;
int[] newNums = new int[length];
for (int i = 0; i < length; i++) {
newNums[(i + k) % length] = nums[i];
}
for (int i = 0; i < length; i++) {
nums[i] = newNums[i];
}
}
}