一個數組中,除了有兩個數字只出現一次外,其他數字都出現兩次,求出這兩個出現一次的數字
阿新 • • 發佈:2018-12-26
求出兩個只出現一次的數字
- 首先,我們知道兩個相同的數字進行異或操作時為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; //index為右移的位數
while(($result%2)&1==0){
$result>>1;
$index++;
}
$num1=0; //用於儲存兩個數字中的一個
$num2=0;
for($i=0;$i<count($arr);$i++){
if(($arr[$i]>>$index)&1 ) //如果為0,為一組
$num1^=$arr[$i];
else
$num2^=$arr[$i]; //為1,為一組
}
echo "num1:",$num1,"<br />";
echo "num2:",$num2;