Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
public class Solution {
public int singleNumber(int[] A) {
int num = 0;
for(int i = 0; i < A.length; i++)
{
num ^= A[i];//XOR
}
return num;
}
}
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?
public class Solution {
public int singleNumber(int[] A) {
if(A == null || A.length == 0) return 0;
int num = 0;
int[] a = new int[32];
for(int i = 0; i < 32; i++){
for(int j = 0; j < A.length; j++){
if(((A[j] >> i) & 1) > 0)
// if((A[j] & (1 << i)) != 0)
a[i] = (a[i] + 1) % 3;
}
num |= (a[i] << i);
}
return num;
}
}
public class Solution {
public int singleNumber(int[] A) {
int ones = 0;
int twos = 0;
int threes = 0;
for(int n : A){
twos |= ones & n;
ones ^= n;
threes = twos & ones;
ones &= ~threes;
twos &= ~threes;
}
return ones;
}
}
/*
* Example
*
* A: 011,101,011,011
* ones = 000;
* twos = 000;
* threes = 000;
* i = 0
* A[0] = 011, twos = (000&011)|000 = 000
* ones = 000^011 = 011
* threes = 000
* i = 1
* A[1] = 101, twos = (011&101)|000 = 001
* ones = 011^101 = 110
* threes = 000
* i = 2
* A[2] = 011, twos = (110&011)|001 = 011
* ones = 110^011 = 101
* threes = ~(011&101) = 110
*
* i = 3
* A[3] = 011, twos = 010
* ones = 111
* threes = 101
*
* i = 4
* A[4] = 011, twos = 000
* ones = 101
* threes = 101
*/