码迷,mamicode.com
首页 > 其他好文 > 详细

Single Number I&& II

时间:2015-06-16 20:58:26      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

Single Number I

直接异或解决。

class Solution {
public:
    int singleNumber(int A[], int n) {
        int res=0;
        for(int i=0;i<n;i++)
        {
            res=res^A[i];
        }
        return res;
    }
};

Single Number II 

分析1

由于int型由32bit表示,因此可以用一个长度为32的int数组保存各个比特位上1出现的次数。最后,将数组各元素对3取余,那么32位数组就纪录了只出现了一次的整数的二进制表示。

public class SingleNumberII {
    private final static int INTEGER_DIGITS = 32;

    public int singleNumber(int[] A) {
        if (A == null || A.length <= 0) {
            return 0;
        }

        int ret = 0;
        int[] count = new int[INTEGER_DIGITS];
        for (int i = 0; i < INTEGER_DIGITS; ++i) {
            for (int j = 0; j < A.length; ++j) {
                count[i] += (A[j] >> i) & 0x0001;
            }
            ret |= (count[i] % 3) << i;
        }
        return ret;
    }
}

分析2 

我们也没必要开 int bit[32]的数组去统计的

我们来模拟二进制加法

用两位来计数,到3就把该位清零。

bit2  bit1

bit1 如果该位来的是1 ,保持0,1,0,1。。。(也就是xor,异或),如果是0就不变

当bit1=1的时候再来一个1,那么bit2=1

当这两个bit同时为1,说明这是3啦(二进制你想想嘛),该位清零。

 

class Solution {  
public:  
    int singleNumber(int A[], int n) {  
        int ones = 0, twos = 0, threes = 0;  
        for(int i = 0; i < n; i++)  
        {  
            threes = twos & A[i]; //已经出现两次并且再次出现  
            twos = twos | ones & A[i]; //曾经出现两次的或者曾经出现一次但是再次出现的  
            ones = ones | A[i]; //出现一次的  
              
            twos = twos & ~threes; //当某一位出现三次后,我们就从出现两次中消除该位  
            ones = ones & ~threes; //当某一位出现三次后,我们就从出现一次中消除该位  
        }  
        return ones; //twos, threes最终都为0.ones是只出现一次的数  
    }  
};  

 

Single Number I&& II

标签:

原文地址:http://www.cnblogs.com/qiaozhoulin/p/4581654.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!