谷歌面试题:数组元素移动交叉

题目:输入数组:{a1,a2,…,an,b1,b2,…,bn}, 在O(n)的时间,O(1)的空间将这个数组的顺序变为{a1,b1,a2,b2,a3,b3,…,an,bn}, 且不需要移动,通过交换完成,只需一个交换空间。

解答:从结果入手,结果数组的中垂线两边分别a数组的一半和b数组的一半的混合,继续将子数组以中垂线划分下去,可以看到类似的规律,因此,可以使用类似的分治算法实现。

参考代码:

view plain
copy to clipboard
print
?

  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. }  

网络转载请注明:转载自程序员面试之家

并注明本文链接地址: 谷歌面试题:数组元素移动交叉

点赞