陣列中數字出現的次數

2021-10-05 13:57:35 字數 1395 閱讀 1509

題目

乙個整型陣列 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,...