陣列中有若干個數,有兩個數隻出現一次,其餘的數都出現了兩次,求出這兩個單獨出現的數。
leetcode260
假設兩個數分別為a和b,思路就是先每個異或,然後得出a和b相異的位,結果為ans
然後取出ans最後為1的位,把原來的陣列分開,再異或一次,得到答案。
這裡取ans最後一位1的操作很巧妙:
ans = ans & (-ans)
假設乙個數ans為******x10000,需要返回的是000000010000。
先將ans取相反數,按照補碼的操作,******10000 -> ******01111-> ******10000
大寫x表示和原來x都是相反的位。所以得到00000010000
另外,c++中輸出二進位制需要技巧:
cout<(ans)<(ans)<(ans)<(ans)《原題的**如下:
class solution ;
}};
在這裡補一下各種碼的區別:
原碼:第一位為符號位,後面的是數值
反碼:正數的反碼是它自己,負數的反碼:對於負數的原碼,第一位符號位不變,其餘各位取反
補碼:正數的補碼是它自己,負數的原碼取反碼後+1,就是負數的補碼。
找出單獨出現的數字
給出n個數字。其中僅有乙個數字出現過一次,其他數字均出現過兩次,找出這個出現且只出現過一次的數字。要求時間和空間複雜度最小。一開始是很普通的想法,從第乙個數開始,從前往後遍歷。但兩個數相同時,將兩數賦乙個不可能出現的值。再重新遍歷陣列,找出沒有被賦予不可能出現值的值。private static s...
每日一題之找出兩個單獨出現的數字
題目 讀入2n個數字,其中,除了有兩個數字是單獨出現外,剩下任何乙個數字出現次數都是偶數個,請寫出演算法找出這兩個數字並輸出 讀入樣例 81 3 4 5 9 1 4 3 輸出 5 9 思路1 看到這道題目,第一反應就是for迴圈列舉一遍,然後統計每個數字出現的次數,最後輸出出現次數是奇數次的 map...
陣列中只出現1次的兩個數字
乙個整型陣列裡除了2個數字分別出現1次之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 如果我們能把問題中的陣列分成2個子陣列,使得每個子陣列中都只有乙個唯一的元素以及很多成對的元素,那麼我們就可以求出每個子陣列中唯一的元素,最終就可以得到...