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

来源:互联网 发布:50岁护肤品推荐知乎 编辑:程序博客网 时间:2024/06/07 19:16

问题描述:给定一个整数数组,长度为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 0
原创粉丝点击