作者:翟天保Steven 題目描述:一個(gè)整型數(shù)組里除了兩個(gè)數(shù)字只出現(xiàn)一次,其他的數(shù)字都出現(xiàn)了兩次。請(qǐng)寫程序找出這兩個(gè)只出現(xiàn)一次的數(shù)字。 數(shù)據(jù)范圍:數(shù)組長(zhǎng)度2≤n≤1000,數(shù)組中每個(gè)數(shù)的大小0<val≤1000000 提示:輸出時(shí)按非降序排列。 示例:輸入: [1,4,1,6] 返回值: [4,6] 說(shuō)明: 返回的結(jié)果中較小的數(shù)排在前面 解題思路:本題考察位運(yùn)算。兩種解題思路。 1)暴力法 ? ? ? ?使用哈希表記錄出現(xiàn)頻率,將頻率為1的數(shù)輸出即可。該方法的空間復(fù)雜度不符合題目要求。 2)異或運(yùn)算 ? ? ? ?異或運(yùn)算指兩個(gè)數(shù)相同為0,不相同為1。因?yàn)槌艘獙ふ业臄?shù)字出現(xiàn)了一次,其他數(shù)字都出現(xiàn)了兩次,所以將這些數(shù)字進(jìn)行異或運(yùn)算后,根據(jù)其特性,重復(fù)出現(xiàn)的數(shù)字抵消了,只保留了出現(xiàn)了一次的數(shù)字。 ? ? ? ?如4^1^2^1^2。4為100,1為001,2為010,4^1得到101,再^2得到111,再^1得到110,再^2得到100,即4。 ? ? ? ?那如果有兩個(gè)出現(xiàn)了一次的數(shù)字,則結(jié)果就相當(dāng)于這兩個(gè)數(shù)字異或。如4^1^2^1^2^3,最終的結(jié)果就是111,即4^3。 ? ? ? ?本題目要求輸出這兩個(gè)數(shù)字,那如何將111拆開(kāi)呢?4和3,如果某一位不相同,則異或結(jié)果該位就是1,我們定義t從001開(kāi)始,將t與111與運(yùn)算,尋找哪一位首次出現(xiàn)了1;111中最右即為1,說(shuō)明在00x的位置,數(shù)字4和3是不一樣的;再次遍歷,將所有數(shù)據(jù)根據(jù)該位的數(shù)字分類,這樣就能得到兩個(gè)組,數(shù)字為1的組結(jié)果就是3,數(shù)字為0的組結(jié)果就是4。 ? ? ? ?不得不說(shuō),這題目就是為這個(gè)解法量身定做的。。。各個(gè)條件完美匹配emm 測(cè)試代碼:1)暴力法
2)異或運(yùn)算
|
|
來(lái)自: 翟天保的圖書館 > 《技術(shù)類文章》