問題描述:給定一個整數數組,長度爲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,