数组的循环右移问题(好未来笔试题)

问题描述:给定一个整数数组,长度为n,现在要求该数组循环右以m个元素。

             例如,数组为{1,2,3,4,5,6,7,8,9},循环右移3个元素后为变成{7,8,9,1,2,3,4,5,6}

分析:这是我曾经参加好未来笔试时的一道编程题目,考完试后,总结了以下几种解法,给大家分享下。

        解法一:辅助空间法,思路很简单,就是另外开辟一块和原来数组一样大小的空间。然后先把原来数组的最后面的m个元素复制到 

                  新数组的前面,然后再把原来数组的前面的元素复制到新数组的后面,最后再把新数组的全部元素复制到原来的数组中,即可。

                 该方法很容易被想到,但是需要额外的辅助空间。

        解法二:三步操作法。

                 第一步:将原来数组全部反序。

                 第二步:再将前m个元素反序。

                 第三步:最后将后面的元素反序。

                 解法二不需要额外的辅助空间,是更好的解法。

由于解法一很简单,我就不再些具体的代码了,针对解法二,写出了如下Java代码:

public class Main {
    public static void reverse(int a[],int i,int j){        //用来实现反序
    	int t;
    	while(i<j)
    	{
    		t=a[i];
    		a[i]=a[j];
    	    a[j]=t;
    	    i++;j--;
    	}
    }
    
	public static void adjust(int a[],int m){               //实现右移位
		if(a==null){                                        //如果数组为空,则直接退出
			System.out.println("数组不存在");
			return;
		}
		if(m<0 ||m>a.length){                               //如果数组不合法则直接退出
			System.out.println("m的范围不对,不合法");
			return;
		}
    	reverse(a,0,a.length-1);                            //第一步:全部反序
    	reverse(a,0,m-1);                                   //第二步:再反序前m个数
    	reverse(a,m,a.length-1);                            //第三步:最后反序后面的a.length-m个数
    }
	
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		int a[]={1,2,3,4,5,6,7,8,9};
		int m=3;
		System.out.print("原数组为:");
		for(int i=0;i<a.length;i++)
        	System.out.print(a[i]+",");
		System.out.println();
        adjust(a,m);
        System.out.print("右移动"+m+"个后为:");
        for(int i=0;i<a.length;i++)
        	System.out.print(a[i]+",");
	}

}

输出结果为:

原数组为:1,2,3,4,5,6,7,8,9,
右移动3个后为:7,8,9,1,2,3,4,5,6,



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值