1. 程式人生 > >一個數組中,除了有兩個數字只出現一次外,其他數字都出現兩次,求出這兩個出現一次的數字

一個數組中,除了有兩個數字只出現一次外,其他數字都出現兩次,求出這兩個出現一次的數字

求出兩個只出現一次的數字

  1. 首先,我們知道兩個相同的數字進行異或操作時為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,或同為1for($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;