【每日一题】错误的集合

错误的集合

 ✨审题:在一个1-n的数组中,会有一个元素重复,一个元素丢失;👉目标;找到重复的元素和丢失的元素并放入一个数组中返还回去


✨有没有想到单身狗问题的进阶版那个思路,找2个单身狗,一个是重复的元素,另一个是丢失的元素🐸那么我是不是可以给数组里的单个元素凑一对情侣出来;反正数组的元素是1-n;发现了么🤔按照单身狗2的思路,我们这个异或起来,就能得到一个2^3的ret 

 接下来就是跟着单身狗2的思路走,找到👨分界线👨>>这一思路的代码

✨分好组以后,就是找单身狗了;先注意因为原数组只有一个数,所以先用一个变量将添加对象pos位等于1的异或起来,然后原数组pos位为1的异或起来,最后二者异或就能找到一只单身狗✨

 ✨最后一步是判断那只狗是存的重复的数,哪只狗存的丢失的数,数组要先放丢失的,用个假设法,遍历原数组看一下dog1是否再原数组,若不在就和dog2互换,然后依次存入新数组

 //单身狗问题的扩展版,相同的元素多一个1
int* findErrorNums(int* nums, int numsSize, int* returnSize) {
    int ret = 0;
    //申请空间
    int* returnNums = (int*)malloc(sizeof(int) * 2);
    *returnSize = 2;
    for (int i = 0; i < numsSize; i++)
    {
        ret ^= (i + 1);
        ret ^= nums[i];
    }
    int pos = 0;
    for (int i = 0; i < 32; i++)
    {
        if ((ret >> i) & 1 == 1)
        {
            pos = i;
            break;
        }
    }
    int dog1 = 0;
    int num = 0;
    for (int i = 1; i <= numsSize; i++)
    {
        if ((i >> pos) & 1 == 1)
        {
            num ^= i;
        }
    }
    for (int i = 0; i < numsSize; i++)
    {
        if ((nums[i] >> pos) & 1 == 1)
        {
            dog1 ^= nums[i];
        }

    }
    dog1 ^= num;
    int dog2 = ret ^ dog1;
    //不确定哪个一是重复的元素,哪一个是丢失的元素,遍历查找找一下 假设法
    int falg = 0;
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] == dog1)
        {
            falg = 1;
            break;
        }
    }
    //交换
    if (falg == 0)
    {
        dog1 = dog2 ^ dog1;
        dog2 = dog2 ^ dog1;
        dog1 = dog2 ^ dog1;
    }
    returnNums[0] = dog1;
    returnNums[1] = dog2;
    return returnNums;
}

就       到        这        吧        !

今天也要加油哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值