力扣数组1122.数组的相对排序

解题思路

此题即最方便的点在于找了一个中间数组。
即先创立一个最终返回的数组,再将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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向光.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值