乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。例如陣列為,找出7和9。
/*
解法1:
1、思路:
(1)對於出現兩次的元素,使用「異或」操作後結果肯定為0,那麼我們就可以遍歷一遍陣列,對所有元素使用異或操作,那麼得到的結果就是兩個出現一次的元素的異或結果。
(2)因為這兩個元素不相等,所以異或的結果肯定不是0,也就是可以再異或的結果中找到1位不為0的位,例如異或結果的最後一位不為0。
(3)這樣我們就可以最後一位將原陣列元素分為兩組,一組該位全為1,另一組該位全為0。
(4)再次遍歷原陣列,最後一位為0的一起異或,最後一位為1的一起異或,兩組異或的結果分別對應著兩個結果。
2、複雜度:
(1)時間複雜度:第一次迴圈,將所有元素異或得到對應結果,時間開銷為o(n);第二次迴圈,找出第一次異或結果為1的位,時間開銷為o(32);第三次迴圈,根據為1的位將元素分為兩組進行異或得到兩個結果,時間複雜度為o(n),所以總的時間複雜度為t(n) = 2*o(n)+o(32) = o(n)。
(2)空間複雜度:常數,因為只分配了兩個空間用於結果的儲存,因此空間複雜度為常數。
*/ if(arr.length < 2)
return arr;
int result = new int[2]; //要返回的結果
int res = arr[0]; //第一次對所有元素進行亦或操作結果
for(int i=1; i>i & 1) == 1)
}for(int i=0; i> bitindex & 1) == 1)
result[0] ^= arr[i]; //對應位為1,亦或得到的結果
else
result[1] ^= arr[i]; //對應位為0,亦或得到的結果
}return result;
}
異或運算(只出現一次的數字)
leetcode刷題總結 目錄 位運算 只出現一次的數字 前言 一 題目示例 二 解題思路 1.異或運算 2.思維解讀 3.如下 總結 很早就學過位運算,但一直沒用應用過,本題使用了異或運算相關性質。只出現一次的數字 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個...
leetcode 只出現一次的數字(異或運算)
只出現一次的數字 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,1 輸出 1 示例 2 輸入 4,1,2,1,2 輸出 4 這道題有乙個重要條件 出現...
陣列中只出現一次的兩個數 異或
題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解決思路 這道題用異或來解決非常巧妙,理解了為什麼這麼做後就有一種毛塞頓開的感覺。利用 其他數字都出現兩次 的條件,從頭到尾進行異或運算,相同的數異或為0,那麼一趟異或下來所有出現了兩次的數都相互抵...