題目
乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1)。
示例 1:
輸入:nums = [4,1,4,6]
輸出:[1,6] 或 [6,1]
示例 2:
輸入:nums = [1,2,10,4,1,4,3,3]
輸出:[2,10] 或 [10,2]
限制:2 <= nums <= 10000
思路講的超好,簡單直接
1.判斷兩數是否相同:異或運算。兩數進行異或運算:相同為0,不同為1。
2.如果陣列中只有乙個數出現一次,其餘都是兩次,則可以將所有數進行異或操作,運算結果就是那個數的值。
3.但現在是兩個數,所以只要將所有數分為兩組,確保每組中有乙個出現一次的數,然後分別進行異或運算。
4.如何分組?
&運算:兩個同時為1時,結果為1;否則為0;
(&1 :就可以判斷是否為偶數。就是判斷最後一位是否為1,若是則是奇數)
通過 & 運算來判斷一位數字不同即可分為兩組,那麼我們隨便兩個不同的數字至少也有一位不同吧!
我們只需要找出那位不同的數字mask,即可完成分組( & mask )操作。
由於兩個數異或的結果就是兩個數數字不同結果的直觀表現,所以我們可以通過異或後的結果去找mask!
所有的可行mask個數,都與異或後1的位數有關。
num1: 101110 110 1111
num2: 111110 001 1001
num1^num2: 010000 111 0110
可行的mask: 010000 001 0010
010 0100
100
因為其他的數異或都為0,所以最後異或的結果其實就是兩個數的異或結果。
假設陣列異或的二進位制結果為10010,那麼說明這兩個數從右向左數第2位是不同的。可以根據陣列裡面所有數的第二位為0或者1將陣列劃分為2個。
所以找出最後面為1的位置,則說明,這兩個數的二進位制在這個位置不一樣,這樣就可以起到分組的作用。
mask <<= 1 : 整數mask按二進位制位左移1位
**
class
solution
//獲得k中最低位的1
int mask =1;
while
((k & mask)==0
)int a =0;
int b =0;
for(
int num: nums)
else
}return
newint
;}}
陣列中數字出現的次數
陣列中數字出現的次數 乙個整型陣列nums裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 示例 1 輸入 nums 4,1,4,6 輸出 1,6 或 6,1 示例 2 輸入 nums 1,2,10,4,1,4,3,3 輸出 2,...
陣列中數字出現的次數
乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。define crt secure no warnings include include include 異或 intcontinuousxor int arr,int sz return ret ...
陣列中數字出現的次數
乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 思路 先整體異或出乙個數ret,變為兩個不同數的異或,因為相同的數,異或都是0,任何數異或0,都是自己本身 然後再找出二進位制中,ret中第乙個1為dif,...