题目描述:
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数
示例 : 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4]
分析:
1.最简单的想法:每次右移一位,分k次完成。。但是,效率太低
2.将数组进行三次翻转:例: 0 1 2 3 4,k=2
第一次:翻转前length-k%length个元素 2 1 0 3 4
第二次:在第一次的基础上翻转全部元素 4 3 0 1 2
第三次:在第二次的基础上翻转前面k个元素 3 4 0 1 2
代码:
1 void rotate(int* nums, int numsSize, int k) { 2 if(k<=0||numsSize<=1||k%numsSize==numsSize) return; 3 int t; 4 int i; 5 int count=(numsSize-k%numsSize)/2; 6 int end=numsSize-1-k%numsSize; 7 //0 1 2 3 4 8 9 for(i=0;i<count;i++) 10 { 11 t=nums[i]; 12 nums[i]=nums[end-i]; 13 nums[end-i]=t; 14 } 15 //2 1 0 3 4 16 end=numsSize-1; 17 for(i=0;i<numsSize/2;i++){ 18 t=nums[i]; 19 nums[i]=nums[end-i]; 20 nums[end-i]=t; 21 } 22 //4 3 0 1 2 23 end=k%numsSize-1; 24 for(i=0;i<k%numsSize/2;i++){ 25 t=nums[i]; 26 nums[i]=nums[end-i]; 27 nums[end-i]=t; 28 } 29 //3 4 0 1 2 30 31 }