用Java实现数组向右的循环移动

一、题目:实现数组的向右循环移动

二、解题思路:

      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;
		} 


 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值