1. 程式人生 > >LeetCode136. 只出現一次的數字

LeetCode136. 只出現一次的數字

題目

給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

說明:

你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 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;
    }
}