一、题目:实现数组的向右循环移动
二、解题思路:
1、 举个例子:
(1) a[1,2,3,4,5,6]向右循环移动2位,那我们知道结果为a[5,6,1,2,3,4],其示范为:
1->3,3->5,5->1
2->4,4->6,6->2这样两遍下来就得到了所要的结果
(2)a[1,2,3,4,5,6,7]向右循环移动3位,那我们知道结果为a[5,6,7,1,2,3,4],其示范为:
1->4,4->7,7->3,3->6,6->2,2->5,5->1这样一遍下来就得到了所要的结果
所以我们将数组元素的个数n跟所要移动的位数k的关系分为两种(m=min(k,n-k)):其一就是n%m==0,进行m遍可以得到结果,其二就是n%m!=0,进行一遍就可以得到结果。
2、为了节约时间和空间,我们可以用变量来记录所覆盖的数组元素。
三、源代码
1、定义一个函数:
public static void move(Integer[] a, Integer k) {
Integer n = a.length;
Integer m = Math.min(k, n - k);
Integer i, j;
2、一次执行到底即n%m!=0
if (n % m != 0) {
Integer start = 0;
//Integer now = start;
Integer to = (start + k) % n;
Integer getdata;
Integer setdata=a[start];
while (to != start) {
getdata = a[to];
a[to] = setdata;
to = (to + k) % n;
setdata = getdata;
}
a[to]=setdata;
}
3、m次执行到底即n%m==0
else {
Integer start = 0;
Integer now=start;
Integer to = (now + k) % n;
Integer getdata;
Integer setdata=a[start];
for (i = 0; i < m; i++) {
start=i;
setdata=a[start];
to=(start+k)%n;
now=to;
while(now!=start) {
getdata = a[to];
a[to] = setdata;
now=to;
to = (to + k) % n;
setdata = getdata;
}
}
}
4、主函数
public class shuzu {
public static void main(String[] args) {
Integer[] data = { 1, 2, 3, 4, 5, 6,7};
move(data, 3);
}
水木轩昊昊
public class shuzu {
public static void main(String[] args) {
Integer[] data = { 1, 2, 3, 4, 5, 6,7};
move(data, 3);
}
if (n % m != 0) {
Integer start = 0;
//Integer now = start;
Integer to = (start + k) % n;
Integer getdata;
Integer setdata=a[start];
while (to != start) {
getdata = a[to];
a[to] = setdata;
to = (to + k) % n;
setdata = getdata;
}
a[to]=setdata;
}