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
Here is another solution
ReplyDeletepublic 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