題目描述
如下圖所示:找出只出現一次的兩個數字,其余都出現了兩次,

題目分析
從整形陣列中找出只出現一次的數字,其余都出現了兩次,
分析
-
用 0 異或所有陣列中元素,找出出現一次的兩個數,
記:temp=0^ 3^ 2^ 3^ 6=2 ^ 6=4(二進制形式:0100) -
找分離temp的分離標志,sep = temp & (-temp ),4&(-4)=4(0100),其中-4在記憶體中是以補碼存盤的哦,不要弄錯了,
判斷陳述句:4 & 2 (0100^0010)= 0(0000) 為零,則跳過,不執行下面陳述句,
4 & 6(0100&0110)=4(0100)不為零,執行下面陳述句,找出第一個出現一次的數,
num[0]=0^ 2 (0000^0010)= 2(0010) 此時分離出來了2, -
分離出來第二個元素,
num[1]=temp^ num[1]=4^ 2 (0100^0010)=6 (0110),
參考代碼
//0^任何都為任何數,出現兩次的數字被異或除掉,只剩出現一次的數字
//分離出來只剩下兩個數字異或的內容
for (i = 0; i < numsSize; i++){
temp = temp ^ nums[i];
}
//接下來兩個不同的數字的異或中分離出來 不同的數字
sep = temp & (-temp );
//提取第一個數字
for (i = 0; i < numsSize; i++){
if (0 != (nums[i] & sep)){
x = x ^ nums[i];//分離出來第一個數
}
}
//提取第二個數字
y = temp ^ x;//分離出來一個數
num[0] = x;//保存找到的出現一次的數
num[1] = y;
總結
以上是我學習的簡單總結,如果有不好請各位大佬提出,我即時改正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/231063.html
標籤:其他
上一篇:RS232、RS485學習筆記
