題目:錯誤的集合
集合 S 包含從1到 n 的整數。不幸的是,因為資料錯誤,導致集合里面某一個元素復制了成了集合里面的另外一個元素的值,導致集合丟失了一個整數并且有一個元素重復。
給定一個陣列 nums 代表了集合 S 發生錯誤后的結果。你的任務是首先尋找到重復出現的整數,再找到丟失的整數,將它們以陣列的形式回傳。
示例 1:
輸入: nums = [1,2,2,4]
輸出: [2,3]
注意:
給定陣列的長度范圍是 [2, 10000]。
給定的陣列是無序的。
代碼如下:
int* findErrorNums(int* nums, int numsSize, int* returnSize){
int resLianxu = 0;
for(int i = 1; i < numsSize + 1; i++)
{
resLianxu ^= i; //從這里看出來我知道這題是用異或運算解的
}
int resUnLianxu = 0;
for(int j = 0; j < numsSize; j++)
{
resUnLianxu ^= nums[j];
}
int resOr = resUnLianxu ^ resLianxu;
int lastbit = resOr & (-resOr); //從這一步開始我就看不懂了,這里為什么要用到按位與運算?為什么要用相反數?請大佬從這里開始往下解釋
int res1 = 0;
int res2 = 0;
for (int m = 0; m < numsSize; m++)
{
if((nums[m] & lastbit) == 0) res1 ^=nums[m];
else res2 ^=nums[m];
}
for (int n = 1; n < numsSize+1; n++)
{
if((n & lastbit) == 0) res1 ^=n;
else res2 ^=n;
}
int *res = (int*)malloc(2 * sizeof(int));
res[0] = res1;
res[1] = res2;
for (int z = 0; z < numsSize; z++)
{
if(res2 == nums[z])
{
res[1] = res1;
res[0] = res2;
}
}
*returnSize = 2;
return res;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/39879.html
標籤:C語言
