給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。
示例 :
輸入: [1,2,1,3,2,5]
輸出: [3,5]
注意:
結果輸出的順序並不重要,對於上面的例子, [5, 3] 也是正確答案。
你的演算法應該具有線性時間複雜度。你能否僅使用常數空間複雜度來實現?
請先翻閱 leetcode 只出現一次的數字
此題就是nums中存在兩個出現一次的元素。
思路分析:
第一步:將所有元素進行異或,得到只出現一次的兩個元素a、b的異或結果。
第三步:根據第二步得到的位置,將原陣列中的元素分成兩個部分進行異或。得到的兩個結果即為解。
解釋關於第三步為什麼可以利用第二步的結果進行分類:如果a、b為兩個不同的數,那麼轉換為32位2進製時,從低位開始尋找,必定會出現有乙個為1,且另外乙個為0的位。而將a^b的結果中轉換為32位2進製,最低為1的位就是前面所尋找的位。(因為1異或0等於1)這樣就可以利用這個位的不同,將原陣列分成兩類,繼而轉換成兩個 只出現一次的數字的問題。
class solution
//從後往前找出第一位為1的位置
int diffnum = 1;
while ((tempres & diffnum) == 0)
int resulta = 0, resultb = 0;
//根據元素種類進行分類
只出現一次的數
給定乙個整數陣列 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...