旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置
转自leetcode 189
//使用额外空间
public void rotate(int[] nums, int k) {
int[] newInt = new int[nums.length];
for(int i=0;i<nums.length;i++){
newInt[(i+k)%nums.length] = nums[i];
}
System.arraycopy(newInt,0,nums,0,nums.length);
}
//不使用额外空间,使用变量保存当下值和即将改变的值,使用count计数
public void rotate(int[] nums, int k) {
int temp,a;//临时变量
int count=0;//计数
int i;
for(int cur=0;count!=nums.length;cur++){
i=cur;
temp=nums[i];
do{
a=temp;
temp=nums[(i+k)%nums.length];
nums[(i+k)%nums.length]=a;
count++;
i=(i+k)%nums.length;
}while(i!=cur);
}
}
//不使用额外空间,翻转数组
public void rotate(int[] nums, int k) {
reverse(nums,0,nums.length-1);
reverse(nums,0,k%nums.length-1);
reverse(nums,k%nums.length,nums.length-1);
}
public void reverse(int[] nums,int i,int j){
int n,temp;
if((j-i+1)%2==1) n=(j-i)/2;
else n=(j-i+1)/2;
for(int k=i,count=0;count<n;k++,count++){
temp=nums[k];
nums[k]=nums[j-count];
nums[j-count]=temp;
}
}