189.轮转数组

Smile_slime_47

原题链接: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;
}
}
Comments
On this page
189.轮转数组