您的位置:首页 > 其它

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

2016-03-29 23:24 267 查看
题目:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: