給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:你的演算法應該具有線性時間複雜度。 不能使用額外空間來實現。
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...