Single Number

除了一个出现1次,其他的数字都出现了3次,找出出现1次的数字

 

32位的二进制中,每一位要么是0,要么是1;

对于数组中的元素,每一个元素其某一位出现1的次数的和,肯定是3N或3N+1次,则次数和对3取模必定是只出现1次的元素在该位的值,即是0或1。

代码:

public class Solution {
    /**
   *出现的次数NUMBER,其他的数字出现次数为1,找出出现次数为1的数
   */
public int NUMBER = 3; public int singleNumber(int[] A) { int result = 0; for (int i = 0; i < 32; i++) { int temp = 0; for (int j = 0, len = A.length; j < len; j++) { temp += 1 & (A[j] >> i); } result = result | ((temp % NUMBER) << i); } return result; } }

 

方法二:

 public int NUM = 3;
    public int singleNumber(int[] nums) {
        int ret = 0, mask = 0, c = 0;
        for(int i = 0;i < 32;i ++){
            mask = 1<<i;
            c = 0;
            for(int j = 0, len = nums.length;j < len;j ++){
                if((nums[j]&mask) != 0){
                    c ++;  
                }
            }
            if(c % NUM != 0){
                ret = ret | mask;
            }
        }
        return ret;
    }

 

 

posted @ 2014-03-29 00:54  qingyezhu  阅读(149)  评论(0编辑  收藏  举报