题目描述:

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。


题目非常简单,分成两段数组分别赋值即可,不过注意是检查的依旧是原数组

1
2
3
4
5
6
7
8
9
10
11
12
//代码如下
public void rotate(int[] nums, int k) {
int[] temp = Arrays.copyOf(nums, nums.length);
k = k % nums.length;//超过一圈后都是循环

for (int i = 0; i < nums.length - k; i++) {
nums[i + k] = temp[i];
}
for (int i = nums.length - k; i < nums.length; i++) {
nums[i - nums.length + k] = temp[i];
}
}

空间复杂度优化

又是进行复杂度优化,好吧,挺困难的,想了半天憋了个这还写不出来233 >:
无所谓了,这里是用循环替代来进行替换(替换到最后会回到原位)
不过这里用最大公因数限制次数确实是没想到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//代码如下
public void rotate(int[] nums, int k) {
int n = nums.length;
k = k % n;
int gcd = gcd(k, n);
for (int i = 0; i < gcd; i++) {
int current = i;
int t1 = nums[i];//为了保留第一个参数
do {
int next = (current + k) % n;
int t2 = nums[next];
nums[next] = t1;
t1 = t2;
current = next;
} while (current != i);
}
}

public int gcd(int x, int y) {
return y > 0 ? gcd(y, x % y) : x;
}

不过还有个大神方法:数组反转
将全部数组反转,再分别反转前k个和后k个即可完成此效果(因为反转后即使只有部分再反转,其中的相对顺序保持不变,根据轮转的效果来看也确实是相对顺序不变,只是分了两块而已)(确实是想不到啊~~)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//代码如下    
public void rotate5(int[] nums, int k) {
int n = nums.length;
k %= n;
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
}

public void reverse(int[] nums, int i, int j) {
while (i < j) {
//数组前后指针的数字交换
int temp = nums[i];
nums[i++] = nums[j];
nums[j--] = temp;
}
}