谷歌面試題:數組元素移動交叉

題目:輸入數組:{a1,a2,…,an,b1,b2,…,bn}, 在O(n)的時間,O(1)的空間將這個數組的順序變爲{a1,b1,a2,b2,a3,b3,…,an,bn}, 且不需要移動,通過交換完成,只需一個交換空間。

解答:從結果入手,結果數組的中垂線兩邊分別a數組的一半和b數組的一半的混合,繼續將子數組以中垂線劃分下去,可以看到類似的規律,因此,可以使用類似的分治算法實現。

參考代碼:

  1. void solve(int arr[],int s ,int e)  
  2. {  
  3.   
  4.     if( s >= e)  
  5.         return;  
  6.   
  7.     int center = (s+e)/2;  
  8.   
  9.     //left part: s,...,center;  
  10.     //right part center+1,...,e  
  11.     int ls = s;  
  12.     int le = center;  
  13.     int rs = center+1;  
  14.     int re = e;   
  15.   
  16.     for(int i=(le+ls)/2+1,j = rs ; i <= le; i++,j++)  
  17.         mySwap(arr[i],arr[j]);  
  18.   
  19.     //奇數個  
  20.     if(le!=ls && (le-ls)%2==0){  
  21.         le++;  
  22.         rs--;  
  23.     }     
  24.   
  25.     solve(arr,ls,le);  
  26.     solve(arr,rs,re);  
  27.   
  28. }  

網絡轉載請註明:轉載自程序員面試之家

並註明本文鏈接地址: 谷歌面試題:數組元素移動交叉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章