漫画算法:找出缺失的整数
轉(zhuǎn)載自?玻璃貓 程序員小灰
?
小灰一邊回憶一邊講述起當(dāng)時(shí)面試的情景......
題目:一個(gè)無(wú)序數(shù)組里有99個(gè)不重復(fù)正整數(shù),范圍從1到100,唯獨(dú)缺少一個(gè)整數(shù)。如何找出這個(gè)缺失的整數(shù)?
解法一:
創(chuàng)建一個(gè)HashMap,以1到100為鍵,值都是0 。然后遍歷整個(gè)數(shù)組,每讀到一個(gè)整數(shù),就找到HashMap當(dāng)中對(duì)應(yīng)的鍵,讓其值加一。
由于數(shù)組中缺少一個(gè)整數(shù),最終一定有99個(gè)鍵值等于1, 剩下一個(gè)鍵值等于0。遍歷修改后的HashMap,找到這個(gè)值為0的鍵。
假設(shè)數(shù)組長(zhǎng)度是N,那么該解法的時(shí)間復(fù)雜度是O(1),空間復(fù)雜度是O(N)。
解法二:
先把數(shù)組元素進(jìn)行排序,然后遍歷數(shù)組,要么有其中兩個(gè)相鄰元素之間的差不是1,要么缺失的整數(shù)是1或100。
假設(shè)數(shù)組長(zhǎng)度是N,如果用時(shí)間復(fù)雜度為O(N*LogN)的排序算法進(jìn)行排序,那么該解法的時(shí)間復(fù)雜度是O(N*LogN),空間復(fù)雜度是O(1)。
解法三:
很簡(jiǎn)單也很高效的方法,先算出1+2+3....+100的合,然后依次減去數(shù)組里的元素,最后得到的差,就是唯一缺失的整數(shù)。
假設(shè)數(shù)組長(zhǎng)度是N,那么該解法的時(shí)間復(fù)雜度是O(N),空間復(fù)雜度是O(1)。
題目擴(kuò)展:一個(gè)無(wú)序數(shù)組里有若干個(gè)正整數(shù),范圍從1到100,其中99個(gè)整數(shù)都出現(xiàn)了偶數(shù)次,只有一個(gè)整數(shù)出現(xiàn)了奇數(shù)次(比如1,1,2,2,3,3,4,5,5),如何找到這個(gè)出現(xiàn)奇數(shù)次的整數(shù)?
解法:
遍歷整個(gè)數(shù)組,依次做異或運(yùn)算。由于異或在位運(yùn)算時(shí)相同為0,不同為1,因此所有出現(xiàn)偶數(shù)次的整數(shù)都會(huì)相互抵消變成0,只有唯一出現(xiàn)奇數(shù)次的整數(shù)會(huì)被留下。
假設(shè)數(shù)組長(zhǎng)度是N,那么該解法的時(shí)間復(fù)雜度是O(N),空間復(fù)雜度是O(1)。
題目第二次擴(kuò)展:一個(gè)無(wú)序數(shù)組里有若干個(gè)正整數(shù),范圍從1到100,其中98個(gè)整數(shù)都出現(xiàn)了偶數(shù)次,只有兩個(gè)整數(shù)出現(xiàn)了奇數(shù)次(比如1,1,2,2,3,4,5,5),如何找到這個(gè)出現(xiàn)奇數(shù)次的整數(shù)?
解法:
遍歷整個(gè)數(shù)組,依次做異或運(yùn)算。由于數(shù)組存在兩個(gè)出現(xiàn)奇數(shù)次的整數(shù),所以最終異或的結(jié)果,等同于這兩個(gè)整數(shù)的異或結(jié)果。這個(gè)結(jié)果中,至少會(huì)有一個(gè)二進(jìn)制位是1(如果都是0,說(shuō)明兩個(gè)數(shù)相等,和題目不符)。
舉個(gè)例子,如果最終異或的結(jié)果是5,轉(zhuǎn)換成二進(jìn)制是00000101。此時(shí)我們可以選擇任意一個(gè)是1的二進(jìn)制位來(lái)分析,比如末位。把兩個(gè)奇數(shù)次出現(xiàn)的整數(shù)命名為A和B,如果末位是1,說(shuō)明A和B轉(zhuǎn)為二進(jìn)制的末位不同,必定其中一個(gè)整數(shù)的末位是1,另一個(gè)整數(shù)的末位是0。
根據(jù)這個(gè)結(jié)論,我們可以把原數(shù)組按照二進(jìn)制的末位不同,分成兩部分,一部分的末位是1,一部分的末位是0。由于A和B的末位不同,所以A在其中一部分,B在其中一部分,絕不會(huì)出現(xiàn)A和B在同一部分,另一部分沒有的情況。
這樣一來(lái)就簡(jiǎn)單了,我們的問題又回歸到了上一題的情況,按照原先的異或解法,從每一部分中找出唯一的奇數(shù)次整數(shù)即可。
假設(shè)數(shù)組長(zhǎng)度是N,那么該解法的時(shí)間復(fù)雜度是O(N)。把數(shù)組分成兩部分,并不需要借助額外存儲(chǔ)空間,完全可以在按二進(jìn)制位分組的同時(shí)來(lái)做異或運(yùn)算,所以空間復(fù)雜度仍然是O(1)。
十分鐘后......
以上就是小灰面試的情況......
?
?
?
總結(jié)
以上是生活随笔為你收集整理的漫画算法:找出缺失的整数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年低端显卡推荐?
- 下一篇: 漫画算法:辗转相除法是什么鬼