深圳 企業(yè)網(wǎng)站建設(shè)2022今日最新軍事新聞
題目描述:劍指 Offer 56 - I. 數(shù)組中數(shù)字出現(xiàn)的次數(shù) - 力扣(LeetCode)
一個整型數(shù)組?
nums
?里除兩個數(shù)字之外,其他數(shù)字都出現(xiàn)了兩次。請寫程序找出這兩個只出現(xiàn)一次的數(shù)字。要求時間復(fù)雜度是O(n),空間復(fù)雜度是O(1)。
示例 1:
輸入:nums = [4,1,4,6] 輸出:[1,6] 或 [6,1]
思路:
異或運算有一個重要的性質(zhì):任何數(shù)與自身異或的結(jié)果為0,任何數(shù)與0異或的結(jié)果仍然是它本身。
- 定義一個等于零的變量,用這個變量異或數(shù)組中所有的值;(此時該變量就等于沒有重復(fù)的兩個數(shù)異或的結(jié)果)
- 找到該變量中為1的二進(jìn)制位;(用來將兩個不相等的兩個數(shù)分隔開。只有兩個不相等的兩個值的同一位置的二進(jìn)制位進(jìn)行異或才能得到1,相等的值的同一位置的二進(jìn)制位進(jìn)行異或得到結(jié)果是0),無論得到哪一位是1,就說明有兩個數(shù)在該位的二進(jìn)制數(shù)不同,以此我們就可以將兩個數(shù)從異或結(jié)果分離。
- 再次遍歷數(shù)組,將數(shù)組中上述位置的二進(jìn)制位為1的值放到數(shù)組一中,將數(shù)組中上述位置的二進(jìn)制位不為1的值放到數(shù)組二中;
- 再定義兩個等于零的變量,用它分別異或數(shù)組一和數(shù)組二中所有的值,最終兩個變量的異或結(jié)果就是兩個不相等的值。
代碼:
int* singleNumbers(int* nums, int numsSize, int* returnSize)
{int temp = 0;for (int i = 0; i < numsSize; i++){temp ^= nums[i];}int div = 1;while ((temp & div) == 0){div <<= 1;}int num1 = 0;int num2 = 0;for (int i = 0; i < numsSize; i++){if ((nums[i] & div) == div){num1 ^= nums[i];}else{num2 ^= nums[i];}}nums[0] = num1;nums[1] = num2;*returnSize = 2;return nums;
}
本次內(nèi)容到此結(jié)束了!如果你覺得這篇博客對你有幫助的話 ,希望你能夠給我點個贊,鼓勵一下我。感謝感謝……