1. 程式人生 > >從leetcode:只出現一次的數 看異或

從leetcode:只出現一次的數 看異或

近期做leetcode上面的程式設計題,遇到了這麼一個題目: 給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。 說明: 你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎? 其實如果不考慮空間複雜度,完全可以藉助其他陣列結構來實現,比如不允許重複的set集合,這裡就不細細討論了。當時思考了很久,要綜合時間複雜度與空間複雜度來看,始終沒有找到一個很好的解決辦法。一搜才發現原來使用異或會這麼簡單,先上程式碼:

 public int singleNumber(int[] nums) {
          int ret = 0;
          int i = 0;
        for( i = 0;i < nums.length;i++){
            ret ^= nums[i];
            
                }

       
        return ret;
        
    }

異或大家都不陌生,只是當時看這道題的時候,沒有發現題目的隱藏條件,其他重複的數字只出現了兩次,這不就是奇數個與偶數個數字嘛,看來以後要認真揣摩題意。好啦,我們來看看為什麼這道題可以用異或解決呢? 首先,我們知道,異或是一種基於二進位制的位運算,用符號XOR或者 ^ 表示,其運演算法則是對運算子兩側數的每一個二進位制位,同值取0,異值取1。 然後,分析這道題其實就是用了異或的一個運演算法則:a XOR a = 0,a XOR 0 = a;這樣一次對陣列中的數字做異或,最終得到的一定是出現個數為奇數的數字。 感覺應用最多的也就是這個法則了吧,最後附上兩道題,一塊來練習一下吧! 1.1-1000放在含有1001個元素的陣列中,只有唯一的一個元素值重複,其它均只出現 一次。每個陣列元素只能訪問一次,設計一個演算法,將它找出來;不用輔助儲存空 間,能否設計一個演算法實現?

2.一個數組存放若干整數,一個數出現奇數次,其餘數均出現偶數次,找出這個出現奇數次的數?