数组中只出现一次的数字

整个数组中只有两个数字各出现了一次,其余数字都出现了两次


刚拿到题时可能没有思路,如果是数组中只有一个数字出现一次,其余数字都出现两次,如何求这一个只出现一次的数字呢


我们想到异或的方法,相同为0,相异为1,通过将数组整体异或,就能得到只出现一次的数字


想到这,如果我们把两个只出现一次的数字分别分到两个不同 的数组中,再分别对这两个数组用异或的方法就能找出两个只出现一次i的数字了


同时我们知道,只要数组中只出现一次的数字不相同(也必然不同),那么那两个数肯定有一位是不同的,我们用位操作将这个不同位找出来,任意找出这两个不同位中的任意一位即可,找出来后,,根据相同的两个数字,在该位表现都相同,就能根据if条件区分成两个数组,分成两个数组后,也就能找出两个数字


void findNumsAppearOnec(int data[],int length,int *num1,int *num2)
{
if(data == NULL || length <= 0)
return ;
int temp = 0;
for(int i = 0;i != length;++i)
temp ^= data[i];//异或的方法,将两只出现一次的数字先找出来,找出来的结果是这两数异或的结果
temp ^= (temp & (temp - 1));//找出两个只出现一次的数字中不相同的一位,,本例找的是最后一位
*num1 = *num2 = 0;
for(int i = 0;i != length;++i)
if(data[i] & temp)//根据这个条件,其实不用另外分配空间
*num1 ^= data[i];
else *num2 ^= data[i];

}

*num1 *num2就是要找的数字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值