189.旋转数组
这感觉有点像是群论里面轮换和对换的关系,【具体介绍待做】
思路一:一个个换过去(失败)
这里失败的原因是:
[-1,-100,3,99]
2
预期结果:
[3,99,-1,-100]
实际结果:
[-1,-100,-1,99]
说明我们的算法只是在-1和3之间反复横跳,原因是(3+2)%4=1,(1+2)&4=3。
class Solution {
public void rotate(int[] nums, int k) {
int l = nums.length;
int tmp = nums[0];
int index = 0;
for(int i=0;i<l;i++){
index = (index+k)%l;
int s = tmp;
tmp = nums[index];
nums[index] = s;
}
}
}
思路二:Reverse数组!
class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length; //注意这里要考虑k比n大的情况,实际上k=n就是绕一圈。
reverse(nums,0,nums.length);
reverse(nums,k,nums.length);
reverse(nums,0,k);
}
// reverse nums[l,r[
public void reverse(int[] nums,int l,int r){
r--;
while(l<r){
int tmp = nums[l];
nums[l] = nums[r];
nums[r] = tmp;
l++;
r--;
}
}
}