數(shù)組中只出現(xiàn)一次的數(shù)字

題目:一個整型數(shù)組里除了兩個數(shù)字之外,其他的數(shù)字都出現(xiàn)了兩次。請寫程序找出這兩個只出現(xiàn)一次的數(shù)字。要求時間復(fù)雜度是O(n),空間復(fù)雜度是O(1)。

這道題如果沒有想到用異或來解決的話,可能就比較不容易做出來了。異或操作有一個好處在于,兩個相同的數(shù)異或的結(jié)果是0,并且異或操作是滿足交換率的,所以異或的順序?qū)Y(jié)果不會有影響。
想到這一點的話,就可以知道,我們首先遍歷一遍整個數(shù)組,得到所有數(shù)字的異或結(jié)果,這個結(jié)果相當(dāng)于是兩個只出現(xiàn)一次的數(shù)字的異或結(jié)果,并且這個結(jié)果一定不是0(因為這兩個數(shù)不一樣)。

假設(shè)這個異或的結(jié)果中,第k位為1,我們根據(jù)第k位是不是1為標(biāo)準(zhǔn),把原數(shù)組分成兩個子數(shù)組,一個子數(shù)組中每個數(shù)字的第k位都是1,另一個子子數(shù)組中每個數(shù)字的第k位都是0,這樣,兩個只出現(xiàn)一次的數(shù)分別被分到不同的子數(shù)組中,并且每對相同的數(shù)字都會被分配到同一個子數(shù)組中。

針對每一個子數(shù)組,再利用異或的方法,即可找到那個只出現(xiàn)一次的數(shù)字。

#encoding=utf8
'''
題目:一個整型數(shù)組里除了兩個數(shù)字之外,其他的數(shù)字都出現(xiàn)了兩次。請寫程序找出這兩個只出現(xiàn)一次的數(shù)字。
要求時間復(fù)雜度是O(n),空間復(fù)雜度是O(1)。
'''
 
def find_two_unique_num(num_list):
    result = 0
    for num in num_list:
        result ^= num
    lowbit = find_lowest_bit(result)
    result_1 = 0
    result_2 = 0
    for num in num_list:
        if num & lowbit != 0:
            result_1 ^= num
        else:
            result_2 ^= num
    return (result_1, result_2)
 
def find_lowest_bit(num):
    index = 0
    while num & 1 == 0:
        num = num >> 1
        index  = 1
    return 1 << index
    
if __name__ == '__main__':
    num_list_1 = [2, 2, 1, 3]
    num_list_2 = [2, 4, 3, 6, 3, 2, 5, 5]
    print find_two_unique_num(num_list_1)
    print find_two_unique_num(num_list_2)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容