剑指offce之数组中只出现一次的数字
来源:互联网 发布:c语言编程软件win10 编辑:程序博客网 时间:2024/05/21 12:44
时间限制:1秒 空间限制:32768K 热度指数:86788
题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
题解:(废话:开始我自己用的是暴力求解,后面看到别人用位运算感觉差距好大;这里主要分享下位运算思路,也帮助自己更好的学习和理解吧)从题目看给出了两个重要信息,其余数字都出现两次(进行异或运算都会抵消),只剩下这两个出现一次的数字。然后根据异或结果,寻找第一个1所在的位置(这里说明有个数的二进制在这里为1,一个在这为0),就可以进行分边了。
代码:
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int len=data.size();
int temp=data[0];
for(int i=1;i<len;++i)
temp^=data[i];//与运算
if(temp==0)
return;
int index=0;
while((temp&1)==0)//找寻第一个1所在的位置
{
temp=temp>>1;
index++;
}
*num1=*num2=0;
for(int i=0;i<len;++i)
{
if(isbit(data[i],index))
*num1^=data[i];
else
*num2^=data[i];
}
}
bool isbit(int temp,int index)
{
temp=temp>>index;
return temp&1;
}
};
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int len=data.size();
int temp=data[0];
for(int i=1;i<len;++i)
temp^=data[i];//与运算
if(temp==0)
return;
int index=0;
while((temp&1)==0)//找寻第一个1所在的位置
{
temp=temp>>1;
index++;
}
*num1=*num2=0;
for(int i=0;i<len;++i)
{
if(isbit(data[i],index))
*num1^=data[i];
else
*num2^=data[i];
}
}
bool isbit(int temp,int index)
{
temp=temp>>index;
return temp&1;
}
};
阅读全文
1 0
- 剑指offce之数组中只出现一次的数字
- 剑指Offer之 - 数组中只出现一次的数字
- 【剑指offer】之数组中只出现一次的数字
- 【剑指offer之数组中只出现一次的数字】
- C++ 算法之 数组中只出现一次的数字
- 牛客网刷题之数组中只出现一次的数字
- 剑指offer_数组---数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数据库视频(一)
- JavaScript 21 函数的调用
- PAT乙级 1003. 我要通过!(20)
- shell 编程之变量
- bzoj1066 [SCOI2007]蜥蜴 网络流复制点模型
- 剑指offce之数组中只出现一次的数字
- Vue框架中添加百度地图组件
- Oracle数据库归档日志满后造成系统宕机解决一例
- mysql中文乱码亲测有用
- JavaScript 22 无间断滚动
- 习题5.8
- GET POST乱码解决
- hello word!
- MySQL主从复制