[leetcode]Single Number II @ Python


原題地址:http://oj.leetcode.com/problems/single-number-ii/

題意:Given an array of integers, every element appears three times except for one. Find that single one.

要求:和single number一樣,線性時間復雜度,不能使用額外空間。

解題思路:這道題就比較難了。也是考察位操作。網上的位操作解法看了好半天也沒有得其精髓。由於序列中除了那唯一的一個數之外所有的數都是三個三個出現的。如果把這些數都轉換成二進制,那么二進制數中1的那些位會連續出現三次,我們可以利用這個思路來解題。比如:3331222轉換成二進制為:11 11 11 01 10 10 10。在第1位上,1出現了4次。第2位上,1出現了6次。那么我們把每一位上為1的個數mod 3剩下的1就是我們所求的數,比如這個例子:4 mod 3 = 1; 6 mod 3 = 0。這樣剩下的二進制位為:01。那最后所求的數就是1了。

       那怎么實現這個想法呢?使用二進制模擬三進制。在連續來3個1后清0。使用兩個bit位,bit1和bit2。初始狀態bit1和bit2都是0,即00,在來了第一個1后,變成了01,來了第二個1后變成了10,來了第三個1后,變成了11,然后清0為00,即:00->01->10->11,然后將11清為00,這個過程就是我們編程的思路。比如如果輸入序列為:1 1 1 1 1 1 1,則變化過程為:00->01->10->11->00->01->10->11->00->01,最后剩下的是1,也就得到了結果。如果位數多那么以此類推,比如序列為:3 3 3 2 2 2 1。則二進制為:11 11 11 10 10 10 01。則低位為1 1 1 0 0 0 1,變化過程為:00->01->10->11->00->00->00->00->01,所以低位剩下1。高位為:1 1 1 1 1 1 0,變化過程為:00->01->10->11->00->01->10->11->00->00,所以高位剩下0。那么最后剩下的是01,也就是1。如果位數更多,可以以此類推。程序中的one相當於bit1,two相當於bit2。

代碼:

class Solution:
    # @param A, a list of integer
    # @return an integer
    def singleNumber(self, A):
        one = 0; two = 0; three = 0
        for i in range(len(A)):
            two |= A[i] & one              #two為1時,不管A[i]為什么,two都為1
            one = A[i] ^ one               #異或操作,都是1就進位
            three = ~(one & two)        #以下三步的意思是:如果one和two都為1時,就清0,反之則保持原來狀態。
            one &= three
            two &= three
        return one

以上是網上的精髓解法,我自己還有個弱智的解法,供參考:

def singleNumber(self, A):
        dict = {}
        for i in range(len(A)):
            if A[i] not in dict:
                dict[A[i]] = 1
            else:
                dict[A[i]] += 1
        for word in dict:
            if dict[word] == 1:
                return word

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM