1:題目
給定乙個整數陣列aar,其中只有兩個數出現了奇數次,其他的數都出現了偶數次,找出這個數。
例如:aar=[1,5,1,5,2,6,4,6],
返回2,4
2:要求
要求時間的複雜度為o(n),額外的空間複雜度為o(1)
3:解答
1:首先可以知道整數k和0異或的結果為k,整數k和k異或的結果為0,這是異或的規律。
2:如果只有乙個數出現奇數次,比如array=[2,3,3],那麼通過異或操作,最後獲取到的結果就是我們需要找的數2。
這是什麼原因呢?可以舉例說明一下,
2的二進位制是0010,3的二進位制是0011,那麼2^3的結果是0001,再次和3異或,結果為0010,而0010的十進位制是2,
異或運算子滿**換律和結合律,同時結合1所說的規律,所以任意調整陣列的位置不會改變運算的結果。
對於任何的陣列,只要這個陣列有乙個數出現了奇數次,另外的數出現了偶數次,最後異或的結果都是出現了奇數次的數。
**可見下面的**部分。
那麼如果有2個數出現奇數次,我們可以用同樣的方法考慮。
a:首先申請乙個變數x,那麼陣列最後異或的結果肯定是兩個出現奇數次的數的異或結果,把它賦值給x。
b:x肯定能在32的位整數中找到不等於0的bit位,假如第k位不等於0,說明這兩個出現奇數次的數,乙個數在第k位為0,乙個在第k位為1。
c:接下來再次對這個陣列分組,乙個陣列是第k位都是0的數的組合,另乙個陣列是第k位都是1的數的組合。
那麼這個分組怎麼分呢 ???思考一下......
乙個數n的相反數可以直接~n+1,乙個數和自己的相反數進行位與,得到的是原數中右起第乙個為1,其餘都為0的數。
比如5的原碼 00000000 00000000 00000000 00000101
則-5在計算機中表達為:11111111 11111111 11111111 11111011
d:再分別對兩個陣列進行各自的異或操作,兩個陣列獲取到的結果就是我們需要找的兩個數。
如果你喜歡,請留下你的贊哦
找出出現奇數次的數
題目 給你n個數,其中有且僅有乙個數出現了奇數次,其餘的數都出現了偶數次。用線性時間常數空間找出出現了奇數次的那乙個數。給你n個數,其中有且僅有兩個數出現了奇數次,其餘的數都出現了偶數次。用線性時間常數空間找出出現了奇數次的那兩個數。答案 從頭到尾異或一遍,最後得到的那個數就是出現了奇數次的數。這是...
找出出現奇數次數的數
function findodd a else for var i 0 iif hash i 2 for var i 0 iif map i 2 function dotest a,n test.describe example tests function 剛開始學js,還只是知道怎麼解,不太會靈...
找2個出現奇數次的數
首先乙個基礎的題就是給你乙個序列,然後這個序列的只有乙個數出現奇數次,其餘數都出現偶數次,找到那個出現奇數的數。最直接的做法就是直接開個vis陣列來存一下,然後vis 當前數 最後for一次找一下就是了,資料大直接卡你,但還有乙個更簡單的方法,就是直接把所有的數異或出來就是最終的答案。int ans...