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
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
相关文章推荐
- LeetCode 313. Super Ugly Number
- C++ STL 中lower_bound() 和 upper_bound()讲解
- 林小欣的every day
- UVa 839 Not so Mobile
- swift 的基本类型之字符串
- 用requests爬取百度搜索数据
- Struts2常用类方法归纳
- 林小欣的every day
- spring概念
- JAVA——程序流程控制——循环语句——for循环(打印三角形)
- 数据库连接池的工作机制
- hdu 1394 Minimum Inversion Number(这道题改日我要用线段树再做一次哟~)
- MySQL表类型
- ajax记录
- Android Volley完全解析(四),带你从源码的角度理解Volley
- 浏览器兼容笔记(1)
- Quicksum -SilverN
- Java位操作全面总结
- 【学习汇总】DIV水平居中
- [BZOJ1036][ZJOI2008]树的统计Count