Single Number && Single NumberII

这两个题,都是用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     }

 

posted @ 2015-04-10 06:59  GoNuts  阅读(129)  评论(0编辑  收藏  举报