【題目描述】
Given2*n + 2numbers, every numbers occurs twice except two, find them.
給出2*n + 2個(gè)的數(shù)字,除其中兩個(gè)數(shù)字之外其他每個(gè)數(shù)字均出現(xiàn)兩次,找到這兩個(gè)數(shù)字。
【題目鏈接】
www.lintcode.com/en/problem/single-number-iii/
【題目解析】
不妨設(shè)最后兩個(gè)只出現(xiàn)一次的數(shù)分別為x1, x2. 那么遍歷數(shù)組時(shí)根據(jù)兩兩異或的方法可得最后的結(jié)果為x1 ^ x2, 如果我們要分別求得x1和x2, 我們可以根據(jù)x1 ^ x2 ^ x1 = x2求得x2, 同理可得x_1. 那么問(wèn)題來(lái)了,如何得到x1和x2呢?看起來(lái)似乎是個(gè)死循環(huán)。
這道題的巧妙之處在于利用x1 ^ x2的結(jié)果對(duì)原數(shù)組進(jìn)行了分組,進(jìn)而將x1和x2分開了。具體方法則是利用了x1 ^ x2不為0的特性,如果x1 ^ x2不為0,那么x1 ^ x2的結(jié)果必然存在某一二進(jìn)制位不為0(即為1),我們不妨將最低位的1提取出來(lái),由于在這一二進(jìn)制位上x1和x2必然相異,即x1,x2中相應(yīng)位一個(gè)為0,另一個(gè)為1,所以我們可以利用這個(gè)最低位的1將x1和x2分開。又由于除了x1和x2之外其他數(shù)都是成對(duì)出現(xiàn),故與最低位的1異或時(shí)一定會(huì)抵消。
【參考答案】