最近看一本书上有一个面试题, 原题目是 有两个递增数组 A1 A2, A1的内存空间足够长, 现在要求合并 A2到A1,并且要求移动次数最小 ,面试的时候 我们尽量要以
最高效的方式完成 ,下面是此题 O(n)解法。
///合并
void MergeArray(int *arrA1,int *arrA2,int nLenA1,int nLenA2)
{
if(!arrA1||!arrA2)
return ;
//合并后的尾部
int *pBehandA1=(arrA1+nLenA1-1+nLenA2);
int *pFrontA1=arrA1+nLenA1-1 ;
int *pEndA2= arrA2+nLenA2-1;
//循环次数 n 或者只剩下第二个数组
for(int i=nLenA1+nLenA2,j=nLenA2,k=nLenA1; i>0; i--)
{
if(j>0&&k>0)
{
//当A2 大于 A1
if(*pEndA2>=*pFrontA1)
{
*pBehandA1=*pEndA2 ;
pEndA2-- ;
j--;
}
//当A2小于 A1
else if(*pEndA2<*pFrontA1)
{
*pBehandA1=*pFrontA1 ;
pFrontA1-- ;
k--;
}
}
//结束
else if(j<=0)
{
break;
}
//当前面数组合并完毕
else if(k<=0&&j>0)
{
*pBehandA1=*pEndA2 ;
pEndA2-- ;
j--;
}
pBehandA1--;
}
}
测试代码
int *p1=new int[100] ;
p1[0]=10;
p1[1]=40;
p1[2]=60;
p1[3]=70;
p1[4]=80;
p1[5]=90;
p1[6]=99;
int *p2=new int[100] ;
p2[0]=3;
p2[1]=7;
p2[2]=9;
p2[3]=11;
p2[4]=21;
p2[5]=22;
p2[6]=33;
MergeArray(p2,p1,7,7);
for(int i=0;i<14;i++){
cout<<p2[i]<<" " ;
}
cout<<endl;
结果