LeetCode136. 只出現一次的數字
阿新 • • 發佈:2019-02-18
題目
給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1] 輸出: 1示例 2:
輸入: [4,1,2,1,2] 輸出: 4
分析
可以用雜湊表,來統計每個數字出現的頻率然後輸入頻率為1的數字。
但是題目要求線性時間複雜度,而且不適用額外空間,使用雜湊表就不符合這個條件。
這個題可以用異或運算,對於異或一直都是隻知道它存在,但從沒用過,瞭解也不多。
異或(xor)是一個數學運算子。它應用於邏輯運算。異或的數學符號為“⊕”,計算機符號為“xor”,在java裡用 ^ 來表示。
運演算法則:
如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0。
異或也叫半加運算,其運演算法則相當於不帶進位的二進位制加法:二進位制下用1表示真,0表示假,則異或的運演算法則為:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同為0,異為1),這些法則與加法是相同的,只是不帶進位,所以異或常被認作不進位加法。
也就是當a b 兩個值相同時,返回0;a b兩個值不相等是,返回1。相同為真,不相同為假。
0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0 同0異1
0 ^ a = a
程式碼
class Solution { public int singleNumber(int[] nums) { int result = nums[0]; for (int i = 1; i < nums.length; i++) result ^= nums[i]; return result; } }