日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

漫画算法:找出缺失的整数

發(fā)布時(shí)間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 漫画算法:找出缺失的整数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。