1. 程式人生 > >【LeetCode 136】只出現一次的數字

【LeetCode 136】只出現一次的數字

從大三開始,給自己立下了刷LeetCode的flag。一方面是鞏固已經快要淡忘的演算法與資料結構知識,另一方面也是為保研的機試作準備。我的第一篇CSDN部落格就獻給這道題。

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

說明:

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

示例 1:

輸入: [2,2,1]
輸出: 1

示例 2:

輸入: [4,1,2,1,2]
輸出: 4

看完這道題,我的腦海中立馬浮現出了兩種方法,一種是對陣列先排序再找數,另一種是使用map記錄各數出現的頻數。然而前者不是線性時間複雜度,後者需要使用額外空間。冥想良久,無果,遂百度求解。知道真相的我禁不住老淚縱橫……廢話不多說,直接show the code!

        int xor = 0;
        for (int i = 0; i < nums.length; i++ ) {
            xor ^= nums[i];
        }
        return xor;

這也太666了,就運用了異或的兩個性質:

  1. A xor A = 0

  2. A xor 0 = A

只要對陣列的元素挨個異或,再運用一下交換律,成雙成對的都被幹成0,而最後落單的那位與0異或還是他自身,就這麼得出了結果……我只想說,如果我現在就匆忙獻上了膝蓋,那我以後可能連四肢都不保了……