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

来源:互联网 发布:水电算量软件 编辑:程序博客网 时间:2024/05/29 09:57

题目:

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


0 0
原创粉丝点击