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