剑指offer-40 数组中只出现一次的数字

来源:互联网 发布:日本心神战斗机 知乎 编辑:程序博客网 时间:2024/05/16 18:42

一、利用异或,首先找到只出现了一次的两个数字的异或值

二、这个数字一定不为0,那么二进制中至少有一位1,找到这个第一位为1的位置--index

三、然后将这个数组按照index分为两部分,第一部分每个数字的第index位都是1,第二部分每个数字的第index位都是0,也就是说两个不同的数字被分到两部分

四、、然后对这两部分分别求异或即可。遍历,对数组的每一个元素进行判断

#include <iostream>using namespace std;unsigned int findFirstBits(int number);void FindNumbers(int *data,int *num1,int *num2,int length);bool IsBits(int number,unsigned int index);/*    1、利用异或,首先找到只出现了一次的两个数字的异或值    2、这个数字一定不为0,那么二进制中至少有一位1,找到这个第一位为1的位置--index    3、然后将这个数组按照index分为两部分,第一部分每个数字的第index位都是1,        第二部分每个数字的第index位都是0,也就是说两个不同的数字被分到两部分    4、然后对这两部分分别求异或即可        首先遍历,对数组的每一个元素进行判断*/void FindNumbers(int *data,int *num1,int *num2,unsigned int length){    if(data ==nullptr || length<1)        return ;    int result = 0;    for(int i = 0; i<length; i++)        result ^= data[i];    unsigned int firstbit = findFirstBits(result);    *num1 = *num2 = 0;    for(int j = 0;j<length;j++)    {        if(IsBits(data[j],firstbit))            *num1 ^= data[j];        else            *num2 ^= data[j];    }}/*    1、每次将这个数右移一位,判断末尾是不是1*/unsigned int findFirstBits(int number){    int index = 0;    while(((number&1) == 0) && (index <8*sizeof(int)))    {        number = number>>1;        ++index;    }    return index;}/*    判断第index 位是不是1    将这个数右移index位,然后与1求与*/bool IsBits(int number,unsigned int index){    number = number>>index;    return (number&1);}int main(){    int a[] = {1,2,3,3,4,4,5,5};    int num1 = 0,num2 = 0;    FindNumbers(a,&num1,&num2,sizeof(a)/sizeof(int));    cout<<num1<<endl;    cout<<num2<<endl;    return 0;}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 东方时尚科二科三考五次没过怎么办 不想考科目三了怎么办 科目三两次没过怎么办 练科目三很紧张怎么办 驾照学员卡丢了怎么办 驾考时考试的车系统出错怎么办 驾驶证超期6个月怎么办 北京汽车年检只有电子保单怎么办 交电费户号9位数怎么办 扬州驾照12分扣完了怎么办 有大专毕业证在深圳怎么办居住证 微信解释包错误怎么办 富士康离职不批怎么办 到了怀孕年龄找不到工作怎么办 建筑公司挂靠发生人员伤残怎么办 外地生小孩落北京户口怎么办 户籍档案查不到直系亲属关系怎么办 考过了二建注册怎么办 异地工作辞职回家档案怎么办 离职怎么办档案放在人才市场 人才房住了6年后怎么办 医保辞职后断了怎么办 社保断了生育险怎么办 深圳小产权房水电费纠纷怎么办 有公租房的再婚怎么办 廉租房被没收了怎么办 商铺到期房东不续租怎么办 天津集体户口买不起房怎么办 房东不想续租了怎么办 唯一住房卖掉后户口怎么办 杭州唯一住房卖掉后户口怎么办 唯一一套住房卖掉户口怎么办 房租押金条丢了怎么办 二建证书跟毕业证丢失怎么办 住宅房到70年怎么办 护照号变了机票怎么办 苹果se指纹坏了怎么办 月经推迟怎么办才能快点来 车载支架不粘了怎么办 otpc平板电脑无法开机怎么办 手表表轴掉了怎么办