1.給2000千萬高考學生排序,要求要能根據分數找到該學生的排名?
千萬別被2000千萬這個數字唬住,理性的看一下題,“高考”這個詞不知道你注意到了沒?這是一個隱藏條件。你高考考了多少分?
總分多少?可能有的小夥伴已經反應過來了。高考700分,那我們開一個700大小的數組,記錄每個分數的的個數就可以了。
對,就是使用桶排序的算法,來進行排。
這一類題他雖然樣子很嚇人,但是仔細 發現他的範圍很小,就抓住他這個範圍小來做文章。
時間複雜度:n 空間複雜度也是700
2.給2億個不重複的正整數進行排序(範圍0-2億)?
一個數比一個數誇張,剛纔我們使用的桶排序,現在數的範圍是很大的,所以我們應該想怎麼把他存儲起來,既能節省空間還快,主要是你怎麼來存儲,2億個int類型,一個int4bit,也就是需要8億bit(8億bit大概等於800M,內存恐怕吃不消)。
此時有一個“不重複”這三個字就特別扎眼,我們怎麼利用這個特性呢?
我們居然不能用一個int去裝,那我們就可以用一位去裝,int = 4bit = 32位。
那麼用的空間就是:2億/32 (大概是25M)這下內存輕輕鬆鬆。
25M大概需要600萬長度的數組。
做法詳情x爲待排序數字。 x/32找到數組下標。x%32找到它對應的位,然後把該位置爲1。
這樣就用奇技淫巧給解決掉了。
3.給你一個超大的文件,找出出現頻率最高的5個?
這道題可能就沒那個多的奇技淫巧了。
條件一個一個的增加,先是找出頻率最高的5個,這個沒有多餘的話,肯定是根據頻率最大堆排序。
那麼一個超大文件,也就是說i我們內存沒辦法直接裝下,可以將這個文件先分解(根據實際內存大小和文件大小判斷,下邊以5000份做例子),這時候我們把文件分成了5000份的小文件,然後我們爲每個小文件構造一個數量爲5的最大堆。其餘的數字就可以清掉了。然後5000個小文件就行排序,這時候歸併就要登場了。
我們通過歸併然後對這5千個數據進行歸併拿前5。這就找到了。
4.一億個int,short類型的數字進行排序?
這個題是在字節二面的時候遇到的,這個題當時沒有想出什麼好的辦法,然後面試官也沒告訴我。
後來查了資料啥的,然後感覺也沒有特別好的方法。
直接快排。
如果有大佬有更好的見解歡迎賜教!