解题思路
此题即最方便的点在于找了一个中间数组。
即先创立一个最终返回的数组,再将arr1数组排序后,令其与arr2数组比较,若一样则传进最终那个数组中,不一样则继续找,但是将他的序号记下来,供后者选择,详细思想见代码注释。
代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int px (int*x,int*y)
{
int a,b;
a=*x;
b=*y;
return a-b;
}
int* relativeSortArray(int* arr1, int arr1Size, int* arr2, int arr2Size, int* returnSize){
int *p=(int*)malloc(sizeof(int)*arr1Size);
int *zj=(int*)malloc(sizeof(int)*arr1Size);
memset(p,0,sizeof(int)*arr1Size);
memset(zj,0,sizeof(int)*arr1Size);//这就是关键的中间数组,先令他整个全为数字0填充的。
int i,j;
int k = 0;//k后续还要用用他的值,所以他不是个循环体内的局部变量
qsort(arr1,arr1Size,sizeof(int),px);//对arr1排序
for(i=0;i<arr2Size;i++)
{
for(j=0;j<arr1Size;j++)//注意arr1与zj长度一样,二者为一个类似序号同步的数组。
{
if(arr1[j]==arr2[i]&&zj[j]==0)//把arr2的一个数定了后,在arr1数组中寻找,若相等则存进去
{ //zj[j]==0这个条件是必定成立的,这是用来提醒自己的
p[k]=arr1[j];
k++;//k在循环完后也代表为总共存放的个数
zj[j]=1;//这一步是灵魂,即在于如果arr1中的这个数满足相等那么我们就令对应的中间数组的
} //与这个数在arr1里对应的序号相等的那个数由0换为1,即代表他是没问题的数,即代表
//这一项经过判断发现没问题,所以不会进行后面的挑选。
}
}
for(i=0;i<arr1Size;i++)//由于arr1与zj序号同步,所以一个i即可
{
if(zj[i]==0)//当为0时则为异常的,即zj他对应的这一项的序号在arr1中对应的数在arr2中找不到
{//这一步的妙处是先由这一项的序号来判断这一项有没有问题,有的话由于序号同步可以直接根据这个序号
//去arr1数组中寻找,所以不用再遍历数组了
p[k]=arr1[i];//由于升降序列我们已经让arr1排列好了,所以直接等于即可
k++;
}
}
free(zj);
*returnSize=arr1Size;
return p;
}