数组的循环右移问题(好未来笔试题)
問(wèn)題描述:給定一個(gè)整數(shù)數(shù)組,長(zhǎng)度為n,現(xiàn)在要求該數(shù)組循環(huán)右以m個(gè)元素。
? ? ? ? ? ? ?例如,數(shù)組為{1,2,3,4,5,6,7,8,9},循環(huán)右移3個(gè)元素后為變成{7,8,9,1,2,3,4,5,6}
分析:這是我曾經(jīng)參加好未來(lái)筆試時(shí)的一道編程題目,考完試后,總結(jié)了以下幾種解法,給大家分享下。
? ? ? ? 解法一:輔助空間法,思路很簡(jiǎn)單,就是另外開(kāi)辟一塊和原來(lái)數(shù)組一樣大小的空間。然后先把原來(lái)數(shù)組的最后面的m個(gè)元素復(fù)制到?
? ? ? ? ? ? ? ? ? 新數(shù)組的前面,然后再把原來(lái)數(shù)組的前面的元素復(fù)制到新數(shù)組的后面,最后再把新數(shù)組的全部元素復(fù)制到原來(lái)的數(shù)組中,即可。
? ? ? ? ? ? ? ? ?該方法很容易被想到,但是需要額外的輔助空間。
? ? ? ? 解法二:三步操作法。
? ? ? ? ? ? ? ? ?第一步:將原來(lái)數(shù)組全部反序。
? ? ? ? ? ? ? ? ?第二步:再將前m個(gè)元素反序。
? ? ? ? ? ? ? ? ?第三步:最后將后面的元素反序。
? ? ? ? ? ? ? ? ?解法二不需要額外的輔助空間,是更好的解法。
由于解法一很簡(jiǎn)單,我就不再些具體的代碼了,針對(duì)解法二,寫(xiě)出了如下Java代碼:
1 public class Main13 { 2 public static void reverse(int a[],int i,int j){ //用來(lái)實(shí)現(xiàn)反序 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){ //實(shí)現(xiàn)右移位 14 if(a==null){ //如果數(shù)組為空,則直接退出 15 System.out.println("數(shù)組不存在"); 16 return; 17 } 18 if(m<0 ||m>a.length){ //如果數(shù)組不合法則直接退出 19 System.out.println("m的范圍不對(duì),不合法"); 20 return; 21 } 22 reverse(a,0,a.length-1); //第一步:全部反序 23 reverse(a,0,m-1); //第二步:再反序前m個(gè)數(shù) 24 reverse(a,m,a.length-1); //第三步:最后反序后面的a.length-m個(gè)數(shù) 25 } 26 27 public static void main(String[] args) { 28 // TODO 自動(dòng)生成的方法存根 29 int a[]={1,2,3,4,5,6,7,8,9}; 30 int m=3; 31 System.out.print("原數(shù)組為:"); 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("右移動(dòng)"+m+"個(gè)后為:"); 37 for(int i=0;i<a.length;i++) 38 System.out.print(a[i]+","); 39 } 40 41 }輸出結(jié)果為:
原數(shù)組為:1,2,3,4,5,6,7,8,9,
右移動(dòng)3個(gè)后為:7,8,9,1,2,3,4,5,6,
轉(zhuǎn)載于:https://www.cnblogs.com/guozhenqiang/p/5469464.html
總結(jié)
以上是生活随笔為你收集整理的数组的循环右移问题(好未来笔试题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。