Single Number

2019-06-02 15:09:36spa

Single Number 問題其實我很早就遇到了,當時仍是第一次刷leetcode,那個時候徹底沒有想到怎麼在<O(n), O(1)>完成這個解答,看了答案以後才恍然大悟,原來可使用異或來解決。這個問題還有不少的變種問題,好比1-n的數字缺乏了一個,找到缺失的那一個(補齊1 - n, 就變成了Single Number),等等。code

後來接觸題目漸多以後,發現原來Single Number只是一個特例,這個問題可擴展性很是強。blog

 

1、Single Numberleetcode

問題描述:class

問題求解:擴展

經典的使用異或解決的問題。im

    public int singleNumber(int[] nums) {
        int res = 0;
        for (int num : nums) res ^= num;
        return res;
    }

  

2、Single Number IIimg

問題描述:di

問題求解:co

結合Single Number,SN問題本質上是因爲對於異或操做來講,每一位置上若是出現了兩個1,那麼就會歸零。考慮到這個問題,若是咱們能定義一個「異或操做」,對於每一個位出現3次1就歸零就行了。那麼,顯然的對於每個位僅僅採用原生的01就不夠了,咱們須要至少兩位才能表徵0,1, 2, 3這三個狀態。

真值表以下:

根據真值表,咱們很容易就能推算出a,b的遞推公式:

a = a!b!c + !abc

b = !ab!c + !a!bc

顯然的是ab == 00表明的是0,ab中任意一位爲1的時候表明的是1,那麼最後的結果就是a | b。

    public int singleNumber(int[] nums) {
        int a = 0;
        int b = 0;
        for (int c : nums) {
            int _a = a;
            a = (a & ~b & ~c) | (~a & b & c);
            b = (~_a & b & ~c) | (~_a & ~b & c);
        }
        return a | b;
    }
相關文章
相關標籤/搜索