leetcode 數字出現次數

2021-10-06 21:37:34 字數 2404 閱讀 8922

先驗知識

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

這是一道非常經典的題目,用 異或 可以輕鬆解決 —— 所有的數字異或起來,就是答案。

為什麼呢?

我們先來看下異或的性質(數學裡異或的符號是 ⊕):

我們可以根據 交換律、 結合律 將相同的數字優先兩兩進行異或運算。此時根據 歸零率 ,每兩個相同的數字都變成了 0,再根據 恒等率 ,把式子裡所有的 0 去了,此時就只剩下只出現一次的那個數了!

0# 所有數字異或的結果

a =0 b =

0for n in nums:

ret ^

= n # 找到第一位不是0的

h =1while

(ret & h ==0)

: h <<=1

for n in nums:

# 根據該位是否為0將其分為兩組

if(h & n ==0)

: a ^

= n else

: b ^

= n return

[a, b]

deffinderrornums

(self, nums: list[

int])-

> list[

int]

: nums =[0

]+ nums

idx =

for i in

range

(len

(nums)):

a, b = self.singlenumbers(nums + idx)

for num in nums:

if a == num:

return

[a, b]

return

[b, a]

260. 只出現一次的數字 3

(就是本題)

題目大意是除了兩個數字出現一次,其他都出現了兩次,讓我們找到這個兩個數。

我們進行一次全員異或操作,得到的結果就是那兩個只出現一次的不同的數字的異或結果。

我們剛才講了異或的規律中有乙個 任何數和本身異或則為0, 因此我們的思路是能不能將這兩個不同的數字分成兩組 a 和 b。

分組需要滿足兩個條件.

兩個獨特的的數字分成不同組

相同的數字分成相同組

這樣每一組的資料進行異或即可得到那兩個數字。

問題的關鍵點是我們怎麼進行分組呢?

由於異或的性質是,同一位相同則為 0,不同則為 1

. 我們將所有數字異或的結果一定不是 0,也就是說至少有一位是 1

.我們隨便取乙個,分組的依據就來了, 就是你取的那一位是 0 分成 1 組,那一位是 1 的分成一組。

這樣肯定能保證 2

. 相同的數字分成相同組,不同的數字會被分成不同組麼。 很明顯當然可以, 因此我們選擇是 1,也就是

說 兩個獨特的的數字 在那一位一定是不同的,因此兩個獨特元素一定會被分成不同組。

```python

class

solution

:def

singlenumbers

(self, nums: list[

int])-

> list[

int]

: ret =

0# 所有數字異或的結果

a =0 b =

0for n in nums:

ret ^

= n # 找到第一位不是0的

h =1while

(ret & h ==0)

: h <<=1

for n in nums:

# 根據該位是否為0將其分為兩組

if(h & n ==0)

: a ^

= n else

: b ^

= n return

[a, b]

leetcode 陣列中數字出現的次數

乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 1 位運算,但是不具有一般性,如果把題目改一改就不行了 2 雜湊表,具有一般性,可以檢視出現任意次數的數字,但是犧牲了空間,這裡題目給出2 define m...

統計數字出現次數

description 某次科研調查時得到了n個自然數,每個數均不超過1500000000 1.5 10 9 已知不相同的數不超過10000個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統計結果。input 包含多個測試資料,每個包含n 1行 第1行是整數n,表示自然數的個...

陣列中數字出現的次數

題目 乙個整型陣列 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 或 1...