數組的循環右移問題(好將來筆試題)

問題描述:給定一個整數數組,長度爲n,如今要求該數組循環右以m個元素。編程

             例如,數組爲{1,2,3,4,5,6,7,8,9},循環右移3個元素後爲變成{7,8,9,1,2,3,4,5,6}數組

分析:這是我曾經參加好將來筆試時的一道編程題目,考完試後,總結了如下幾種解法,給你們分享下。spa

        解法一:輔助空間法,思路很簡單,就是另外開闢一塊和原來數組同樣大小的空間。而後先把原來數組的最後面的m個元素複製到 code

                  新數組的前面,而後再把原來數組的前面的元素複製到新數組的後面,最後再把新數組的所有元素複製到原來的數組中,便可。blog

                 該方法很容易被想到,可是須要額外的輔助空間。class

        解法二:三步操做法。循環

                 第一步:將原來數組所有反序。方法

                 第二步:再將前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,

相關文章
相關標籤/搜索