数组中只出现一次的数字

来源:互联网 发布:朝勇投资有限公司 知乎 编辑:程序博客网 时间:2024/06/14 07:24

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


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


我们想到异或的方法,相同为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
原创粉丝点击