原题链接:https://leetcode.cn/problems/rotate-array/
题解
方法1:
写一个循环右移索引的函数,让pos不断右移k位,每次移位和begin交换位置,直到pos回归到begin为止
这种情况会有遍历不完全的情况,设置一个cnt记录操作的元素数量,当cnt没有达到数组长度时begin++并再次循环交换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { public void rotate(int[] nums, int k) { int begin=0,pos=0,cnt=0; pos=cycleIndex(nums,begin,k);
while(cnt<nums.length){ while(begin!=pos){ swap(nums,begin,pos); pos=cycleIndex(nums,pos,k); cnt++; } cnt++; begin++; pos=cycleIndex(nums,begin,k); } } void swap(int[] nums,int a,int b){ int temp; temp=nums[a]; nums[a]=nums[b]; nums[b]=temp; } int cycleIndex(int[] nums,int pos,int range){ int ret=pos+range; while(ret>nums.length-1){ ret=ret-(nums.length); } return ret; } }
|
方法2:
建立一个新数组,把原数组索引i的元素放在新数组i+k(经过循环右移)的位置上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public void rotate(int[] nums, int k) { int[] ans=nums.clone();
for(int i=0;i<nums.length;i++){ nums[cycleIndex(nums,i,k)]=ans[i]; } }
int cycleIndex(int[] nums,int pos,int range){ int ret=pos+range; while(ret>nums.length-1){ ret=ret-(nums.length); } return ret; } }
|