27.leetcode题目137: Single Number II(考察位操作)

题目:

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?


分析:

方法一,使用map统计每个元素出现的次数(28ms)

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        map<int,int> tar;
        for(vector<int>::size_type i=0;i<nums.size();++i){
            //if(find(nums[i])==nums.end()){
                ++tar[nums[i]];
            }
        for(map<int,int>::iterator it=tar.begin();it!=tar.end();++it){
            if(it->second==1){
            return it->first;
            //break;
            }
        }
    }
};
方法2,位操作(参考别人博客)

对于右数第i位,如果孤异元素该位为0,则该位为1的元素总数为3的整数倍。

如果孤异元素该位为1,则该位为1的元素总数不为3的整数倍。

换句话说,如果第i位为1的元素总数不为3的整数倍,则孤异数的第i位为1,否则为0.

(如果非孤异元素重复n次,则判断是否为n的整数倍)

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int res=0;
        int mask=1;//统计相应位为1的个数,若异常数该位为0,则该位1的个数为3的整数倍
        while(mask){
        int count=0;
        for(vector<int>::size_type i=0;i<nums.size();++i){
            if(nums[i]&mask){     //统计相应位为1的个数
                ++count;
            }
        }
        if(count%3!=0){          //不是3的整数倍则异常数该位为1
            res|=mask;
        }
        mask<<=1;                //mask左移一位
        }
        return res;
    }
};

20ms


你可能感兴趣的:(27.leetcode题目137: Single Number II(考察位操作))