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

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

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

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

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

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

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

        解法二:三步操作法。

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

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

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

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

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

 1 public class Main13 {
 2     public static void reverse(int a[],int i,int j){        //用来实现反序
 3         int t;
 4         while(i<j)
 5         {
 6             t=a[i];
 7             a[i]=a[j];
 8             a[j]=t;
 9             i++;j--;
10         }
11     }
12     
13     public static void adjust(int a[],int m){               //实现右移位
14         if(a==null){                                        //如果数组为空,则直接退出
15             System.out.println("数组不存在");
16             return;
17         }
18         if(m<0 ||m>a.length){                               //如果数组不合法则直接退出
19             System.out.println("m的范围不对,不合法");
20             return;
21         }
22         reverse(a,0,a.length-1);                            //第一步:全部反序
23         reverse(a,0,m-1);                                   //第二步:再反序前m个数
24         reverse(a,m,a.length-1);                            //第三步:最后反序后面的a.length-m个数
25     }
26     
27     public static void main(String[] args) {
28         // TODO 自动生成的方法存根
29         int a[]={1,2,3,4,5,6,7,8,9};
30         int m=3;
31         System.out.print("原数组为:");
32         for(int i=0;i<a.length;i++)
33             System.out.print(a[i]+",");
34         System.out.println();
35         adjust(a,m);
36         System.out.print("右移动"+m+"个后为:");
37         for(int i=0;i<a.length;i++)
38             System.out.print(a[i]+",");
39     }
40 
41 }

输出结果为:

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

原文地址:https://www.cnblogs.com/guozhenqiang/p/5469464.html