错误的集合
✨审题:在一个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;
}
就 到 这 吧 !
今天也要加油哦!