17 只出現一次的數字 I II III

2021-10-21 18:45:08 字數 1648 閱讀 5458

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

說明:你的演算法應該具有線性時間複雜度。 不能使用額外空間來實現。

1.對於這道題,可使用異或運算⊕。異或運算有以下三個性質:

(1)任何數和 0 做異或運算,結果仍然是原來的數,即 a⊕0=a。

(2)任何數和其自身做異或運算,結果是 0, a⊕a=0。

(3)異或運算滿**換律和結合律,即a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。

2.遍歷陣列,陣列中的全部元素的異或運算結果即為陣列中只出現一次的數字。

class

solution

return val;}}

;

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

說明:你的演算法應該具有線性時間複雜度。 不能使用額外空間來實現。

1.定義乙個大小為32的陣列 bitarray[32],統計32個位中合計1的個數。(int型別為32bit)

2.遍歷nums陣列,統計每個數字32個位中1的個數,如果第 i 位為1,將bitarray[i]++。(其中1的個數要麼為 3m,要麼為 3m+1)

3.遍歷陣列 bitarray,取出32個位中個數為 3m+1 的位,將這些位組成數字,即為所求。

class

solution

;//統計n個數中32個位中合計1的個數

for(

auto e: nums)

}//1的個數為 3m 或者 (3m+1)

int val=0;

for(

int i=

0;i<32;

++i)

return val;}}

;

給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。你可以按 任意順序 返回答案。

1.把所有的元素進行異或操作,最終得到乙個異或值val。因為是不同的兩個數字,所以這個值必定不為 0。

2.從低位開始,從低位開始,找到val中第乙個為 1 的位pos:是 1 則表示兩個數字在這一位上不同。

3.遍歷陣列 nums ,檢查每個數字的第pos位的值:

(1)如果為 0 的分為乙個陣列。

(2)如果為 1 的分為另乙個陣列。

這樣就把問題降低成了:「有乙個陣列每個數字都出現兩次,有乙個數字只出現了一次,求出該數字」。對這兩個子問題分別進行全異或就可以得到兩個解,也就是最終的陣列了。

class

solution

//從低位開始,找到val中第乙個為1的位

int pos=0;

for(

int i=

0;i<32;

++i)

}//分離:將第pos位為1的分到一起,將第pos位為0的分到一起

//此時問題就轉換為了--> 只出現一次的數字i

int num1=

0,num2=0;

for(

auto e : nums)

vector<

int> v

;return v;}}

;

只出現一次的數字

1.乙個整型陣列,有乙個數字出現一次,其餘數字出現兩次,找出這個只出現一次的數字。解題思路 異或運算性質 兩個相同的數字異或得0,0與乙個數字異或得數字本身,而且異或運算是滿足交換律的 陣列元素按位異或,交換律可以想象成相同的數字參與運算的時候是相鄰的 所有出現兩次的數字異或之後得0,最後剩餘的是0...

只出現一次的數字

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,1 輸出 1示例 2 輸入 4,1,2,1,2 輸出 4核心思想 對list排序,然後遍歷 class ...

只出現一次的數字

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素 例 1,2,2 1 方法一 異或 數字1 數字2 每一位如果相同就為0,不同為1 1 1 0 1 0 1 0 1 1 0 0 0 class solution def singlenumber se...