LeetCode筆記:136. Single Number 單身狗數問題

觥籌交錯的夜,有人在調情,有人在調代碼。情人節剛過,讓我們看一道應景的算法題,136. Single Number,我給他起名叫單身狗數問題。

問題

Given a non-empty array of integers, every element appears twice except for one. Find that single one. Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

分析

這道題目的大意是:給定一個非空整數數組,其中所有的元素都會出現兩了次,只有一個出現了一次,找出這隻單身狗。比如[2,2,1]中的1,[4,1,2,1,2]中的4。另外題目要求,時間複雜度O(n),空間複雜度O(1)。

思路1

暴力破解。遍歷數組將各元素放入map並計數。再遍歷map找到計數爲1的元素,即爲答案。但這種解法使用了額外空間map,顯然不是最佳方案,就不放代碼演示了。

思路2

位運算。兩個二進制數做異或運算,兩位相同則爲0,兩位不同則爲1。可以推出,兩數相同(即每一位都相同),異或結果爲0,即a xor a=0;一個數兩次異或同一個數最後結果不變,即(a xor b) xor b = a。所以將數組中的元素依次做異或運算,最後的結果就是隻出現一次的那個Single Number。代碼如下:

class Solution {
    public int singleNumber(int[] nums) {
        int c = nums[0];
        for (int i=1; i<nums.length; i++) {
            c = c ^ nums[i];
        }
        return c;
    }
}
總結

這道題可以暴力破解,也有思路很妙的解法,可以說以異或運算的完美實踐,學會後有一點恍然大悟的小小幸福感。引人入勝,非常適合作爲刷題的入門。位運算在算法題中還是很常用的,需要多多練習培養思路和敏感度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章