数组整体右移k位问题

问题:
如何把一个数组循环右移K位 如:12345678 右移2位 78123456

思路一:写一个方法,让数组右移一位,要求右移几位就调用多少次

思路二:我们先将数组分成两部分, 设后面K位为数组b, 前面length()-K位为数组a, 那么怎么数组的组成就是ab.原始数组是ab, 我的目的是将这个数组变成ba

第一步:将整个长度为N的数组倒置得到$b^{-1}$ $a^{-1}$

第二步:将$b^{-1}$数组和$a^{-1}$ 数组分别倒置, 得到 ba数组.

具体代码如下

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.Arrays;

public class {
public static void main(String[] args) {
int[] nums = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
int k = 2;
System.out.println(Arrays.toString(nums));

// 方法一:暴力循环调用右移一次的函数

for (int i = 0; i < k; i++) {
youYiOnce(nums);
}
System.out.println(Arrays.toString(nums));

// 方法二:

//将整个长度为N的数组倒置得到b^{-1}a^{-1}
reverse(nums, 0, nums.length - 1);
//将b^{-1}数组和a^{-1} 数组分别倒置, 得到 ba数组.
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
System.out.println(Arrays.toString(nums));

}
//右移一次的函数
public static void youYiOnce(int[] nums) {
int last = nums[nums.length - 1];
for (int i = nums.length - 2; i >= 0; i--) {
nums[i + 1] = nums[i];
}
nums[0] = last;
}

//转置数组的第start到end位
public static void reverse(int[] nums, int start, int end) {
for (int i = start; i <= end; i++) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
}