只出現一次的數字
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
這道題有乙個重要條件:出現一次的元素只有乙個,其餘每個元素均出現兩次。
當時做的時候用的是雜湊map,空間複雜度o(n),不滿足說明要求。如果熟悉異或運算,應該可以很快想到用這個方法,因為這道題非常符合異或運算的特性。下面介紹一下異或運算。
異或運算也稱為xor,其運算法則相當於不帶進製的二進位制加法。如果a、b兩個二進位制位不相同,則異或結果為1。如果a、b兩個二進位制位相同,異或結果為0。同為0,異為1. 異或符號在c/c++中用^表示。
舉個例子: 8的二進位制是:0000 1000,4的二進位制是:0000 0100
那麼 8^4 = 0000 1100 轉化為十進位制為12.
那麼異或運算如何運用到這乙個題目呢?這裡先介紹異或運算的兩個特性:
0^a = a. 0與任何數進行異或運算結果等於該數。
a^a = 0. 兩個相同數進行異或運算結果等於0.
由以上可以得出,假設ans = 0, a, b為兩個整數,那麼 ans ^ a ^ a ^ b = 0 ^ 0 ^ b = b.
那樣例2舉例,int ans = 0,那麼ans ^ 4 ^ 1 ^ 2 ^ 1 ^ 2 = 4,因為在異或運算**現相同的兩個數計算結果為0(特性2),剩下的那乙個數與0進行異或運算結果等於該數(特性1)。
意思應該很明確了。**如下:
class solution
return ans;}}
;
只出現一次的數
給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其他所有元素均出現兩次。找出只出現一次的那兩個元素。示例 給定 nums 1,2,1,3,2,5 返回 3,5 注意 結果的順序並不重要,對於上面的例子 5,3 也是正確答案。你的演算法應該具有線性複雜度,你能否僅使用恆定的空間複雜度來實現它...
只出現一次的數
問題描述 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。解決思路 將陣列中元素全部異或,根據異或特點,出現兩次的元素異或後結果為0,陣列全部異或之後的結果就是只出現一次的那個元素。實現 int singlenumber vector int n...
只出現一次的數
問題 有n個數,其中只有乙個數出現一次,其他的都出現兩次,求這個數 空間複雜度為常數 全部xor起來即可 include includeusing namespace std int main printf d n xor sum return 0 1231 3 1 51 2 3 2 3 inclu...