求出两个只出现一次的数字
- 首先,我们知道两个相同的数字进行异或操作时为0,如果题目里面只有一个数字出现一次的话,我们就可以直接对数组中的所有数字进行异或操作,最后得到的数字就是单独出现的那个数字,但是题目中给的是2个出现一次的数字,
那我们尝试可以把这个数组拆分成两个数组,将两个出现一次的数字分到不同的组里面,在进行异或操作
<?php
$arr=array(1,1,2,2,3,3,4,5,4,5,7,6,7,6,8,9,9,8,10,12,11,12,10,100);
$result=0;
如果余数是1的话,那么这个bit位的1就是两个数字中的一个,而另外一个数
字,这个bit位就不可能是1了,所以我们可以根据这个标志来拆分数组。而两个
相同数字该位的值都是一样的(同为0,或同为1)
for($i=0;$i<count($arr);$i++){
$result^=$arr[$i];
}
$index=0;
while(($result%2)&1==0){
$result>>1;
$index++;
}
$num1=0;
$num2=0;
for($i=0;$i<count($arr);$i++){
if(($arr[$i]>>$index)&1)
$num1^=$arr[$i];
else
$num2^=$arr[$i];
}
echo "num1:",$num1,"<br />";
echo "num2:",$num2;