Hi,大家好~又到了每週一的LeetCode時間了~
本週我們給大家帶來了一道位運算相關的題目——只出現一次的數字。
描述
給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例
輸入:
[2,2,1]
輸出:
1
輸入:
[4,1,2,1,2]
輸出:
4
常規解法
在正式的解法之前,我們先拋開題目中對於額外空間的限制。最容易想到的解法就是使用一個額外的存儲空間保存出現過的數字及其出現的次數,並在最後從此存儲空間中取出次數爲1的數字即可。
解法
我們在一開始就提及到本題是一道位運算相關的題目,在不借助額外的存儲空間的情況下就可以藉助異或運算達到效果。
在編寫代碼前,我們先複習一下異或的運算。在命題邏輯中使用符號⊕表示,對於兩個二進制值P和Q,當P或Q爲真且不同時爲真時,P⊕Q成立。對應的當p=1
且q=0
或p=0
且q=1
時,p^q
等於1。
對於我們這個題來說,有一個關鍵的前提條件,即除只出現一次的數字外,其它數字均出現兩次。通過異或運算我們可以知道,兩個相同的數字通過異或運算的結果爲0。所以我們可以對所有的數值進行異或運算從而得到只出現一次的數字。我們可以以[3,2,2,1,3]
爲例看看異或運算的操作:
11(3) ^ 10(2) = 01(1)
01(1) ^ 10(2) = 11(3)
11(3) ^ 01(1) = 10(2)
10(2) ^ 11(3) = 01(1)
從上面可以看到,我們通過一系列異或的運算,最終可以得到所有值中唯一一個只出現一次的數字。下面就讓我們來看看代碼的實現:
public int SingleNumber(int[] nums)
{
// 用於保存運算的結果
int res = 0;
foreach (var num in nums)
{
res ^= num;
}
return res;
}
結束語
LeetCode上還有很多位運算相關的題目,大家也可以繼續通過它們來練習。在以後的文章中,我們也會選擇一些位運算相關的題目來講解。
那今天的內容就到這裏啦,下週再見👋~
歡迎大家關注我的公衆號“風紙”,或是掃下面的二維碼關注👇