这两个题,都是用bit operation解决的,但是第二个稍微tricky一点。
先说第一个,我们利用XOR, 如果一个数字出现两次,那么在每一位上,两两抵消。唯独那个只出现一次的,没有另一半和它抵消了。。所以就剩下了。
1 public int singleNumber(int[] A) { 2 if (A == null) { 3 return 0; 4 } 5 int ret = 0; 6 for (int i = 0; i < A.length; i++) { 7 ret = ret ^ A[i]; 8 } 9 return ret; 10 }
Single NumberII
这时再使用一的方法,就不好用了。怎么才能过滤掉出现三次的情况呢? 我们对这些数字的每一位出现的次数计数。如果出现三次,则归零。实现起来就是,该位一的个数就是:count % 3.
1 public int singleNumber(int[] A) { 2 if (A == null || A.length == 0) { 3 return 0; 4 } 5 int res = 0; 6 for (int i = 0; i < 32; i++) { 7 int sum = 0; 8 for (int j = 0; j < A.length; j++) { 9 if (((A[j] >>> i) & 1) == 1) { 10 sum++; 11 sum = sum % 3; 12 } 13 } 14 res |= sum << i; 15 } 16 return res; 17 }