題目:輸入數組:{a1,a2,…,an,b1,b2,…,bn}, 在O(n)的時間,O(1)的空間將這個數組的順序變爲{a1,b1,a2,b2,a3,b3,…,an,bn}, 且不需要移動,通過交換完成,只需一個交換空間。
解答:從結果入手,結果數組的中垂線兩邊分別a數組的一半和b數組的一半的混合,繼續將子數組以中垂線劃分下去,可以看到類似的規律,因此,可以使用類似的分治算法實現。
參考代碼:
- void solve(int arr[],int s ,int e)
- {
- if( s >= e)
- return;
- int center = (s+e)/2;
- //left part: s,...,center;
- //right part center+1,...,e
- int ls = s;
- int le = center;
- int rs = center+1;
- int re = e;
- for(int i=(le+ls)/2+1,j = rs ; i <= le; i++,j++)
- mySwap(arr[i],arr[j]);
- //奇數個
- if(le!=ls && (le-ls)%2==0){
- le++;
- rs--;
- }
- solve(arr,ls,le);
- solve(arr,rs,re);
- }
網絡轉載請註明:轉載自程序員面試之家
並註明本文鏈接地址: 谷歌面試題:數組元素移動交叉