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