黑马程序员技术交流社区
标题:
还是关于输入数的移位问题
[打印本页]
作者:
BlackHorse001
时间:
2015-9-1 08:24
标题:
还是关于输入数的移位问题
有
n
个整数,使其前面各数顺序向后移
m
个位置,最后
m
个数变成最前面的
m
个数
作者:
耀阳圣尊
时间:
2015-9-1 09:53
public static void main(String[] args) {
int shift = 3;
int[] arr;
arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
shiftLeft(arr, shift);
System.out.printf("向左移动%d %s%n", shift, Arrays.toString(arr));
arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
shiftRight(arr, shift);
System.out.printf("向右移动%d %s%n", shift, Arrays.toString(arr));
}
/**
* 向右移动 要求 arr != null && arr.length >= 1 && shift >= 0
*/
public static void shiftRight(int[] arr, int shift) {
if ((shift %= arr.length) == 0) {
return;
}
int len = arr.length;
int step = GCD(len, shift);
int round = len / step;
for (int i = 0; i < step; i++) {
int t = arr[(i + shift * round) % len], index1 = 0, index2 = 0;
for (int j = round; j > 1; j--) {
index2 = (i + shift * j - shift) % len;
index1 = (index2 + shift) % len;
arr[index1] = arr[index2];
}
arr[index2] = t;
}
}
/**
* 向左移动 要求 arr != null && arr.length >= 1 && shift >= 0
*/
public static void shiftLeft(int[] arr, int shift) {
if ((shift %= arr.length) == 0) {
return;
}
int len = arr.length;
int step = GCD(len, shift);
int round = len / step;
for (int i = 0; i < step; i++) {
int t = arr[i], index1 = 0, index2 = 0;
for (int j = 0; j < round - 1; j++) {
index1 = (i + shift * j) % len;
index2 = (index1 + shift) % len;
arr[index1] = arr[index2];
}
arr[index2] = t;
}
}
/**
* 辗转相除法求最大公约数 要求 a > 0 && b > 0
*/
public static int GCD(int a, int b) {
while (b != 0) {
int t = a;
a = b;
b = t % b;
}
return a;
}
复制代码
如果您觉得我的回答还满意的话,请回复一下我
我的QQ:2355928351
如果您还有其他的入学前问题可以加我的QQ
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2