Thursday, June 12, 2014

LeetCode (Python): Single Number II

Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 

Solution:

We keep tree variables: one with the bits that appear $3k+1$ times, two with those that appear $3k+2$, and three with $3k$, such that $k$ is an integer.

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(0, len(A)):
            nextOne = (one & ~A[i]) | (three & A[i])
            nextTwo = (two & ~A[i]) | ( one & A[i])
            nextThree = (three & ~A[i]) | (two & A[i])
            one = nextOne
            two = nextTwo
            three = nextThree
        return one

1 comment :

  1. Here is another solution
    public class Solution {
    public int singleNumber(int[] nums) {
    int p = 0;
    int q = 0;
    for(int i = 0; i<nums.length; i++){
    p = q & (p ^ nums[i]);
    q = p | (q ^ nums[i]);
    }
    return q;
    }
    }
    Analysis from this blog post : http://traceformula.blogspot.com/2015/08/single-number-ii-how-to-come-up-with.html 

    ReplyDelete