1. 程式人生 > >今日頭條春招研發筆試題解密

今日頭條春招研發筆試題解密

今日頭條 2017 研發崗實習生招聘,真的好難好難,轉了頭條官微的題解。。。。只是想找一個實習崗。

Prob 1. 找出函式的最寬尖峰

正確率:1149 / 5371

題意:求給定數列 A 中先升後降的最長連續子序列,要求 O(n)。

題解:簡單題。預處理 left[i] 表示以 A[i] 為結尾的連續最長上升序列長度,right[i] 表示 A[i] 為起始的連續最長下降序列長度,那麼答案實際上就是 max{left[i] + right[i] - 1},更新答案時順便記錄最優區間即可。

唯一的 trick 是 left[i] > 1right[i] > 1 必須同時滿足,這一點在題目中已經有說明。

Prob 2. Paragraph

正確率:732 / 3732

題意:給定一個英文段落(包含 n 個句子)和 m 次查詢,每次給定一個句子,求段落中相同單詞數量最多的句子。各個英文句子不包含標點,大小寫不敏感。

題解:做法很多,時間卡得也比較寬鬆。一個簡單做法是對原文的各個英文句子,都預處理包含的單詞集合(如果用 hash set 的話,這一步複雜度是 O(n * w))。對於每次查詢,列舉句子中的單詞到各個 set 中查詢是否存在,隨後統計出現次數取 max 即可。這樣查詢部分總的複雜度是 O(m * w * n)。

更快的做法是對原文出現的所有單詞,通過一個 hash map
維護它們分別出現在哪些原文句子中,這個預處理的複雜度同樣是 O(n * w) 的。在每次查詢的時候,列舉句子中的單詞,給它在原文中出現過的句子進行計數,最後在所有的計數當中取 max 即為答案。查詢部分的複雜度是 O(m * (w + n)) 的。 無論是哪種做法,最重要的 trick 是各個單詞的去重,防止多次計數。很多同學在程式碼中踩了這個坑。

Prob. 3 繪製括號序列

正確率:87 / 1655

題意:給定一個合法的括號序列,以字元矩陣的形式翻轉後輸出。

題解:程式碼實現題。先預處理每一個括號的深度,從而推出應列印的括號的大小,剩下的就是掃一遍處理下列印細節了。一個可能的 trick:注意行末不要輸出多餘的空格。

Prob. 4 數列

正確率:36 / 4550

題意:給定兩個數列 A 和 B 以及 q 組查詢 (x, y),每次求滿足 A[i] >= x 且 B[i] >= y 這樣的 i 的數量。

題解:暴力的 O(n * q) 的做法可以通過 30% 的資料。考慮把原先所有 (A[i], B[i]) 整數對按照 A 排序,所有查詢按照 x 排序。隨後從小到大掃描所有查詢 (x[i], y[i]),維護一個指標 k 指向 AB 對中滿足 A[k] >= x[i] 的位置。對於當前的這次查詢,要求的就是所有大於 k 的位置中,滿足 B[k] >= y[i] 的數量。因此我們維護一個高效支援 insert / delete / lower_bound 的資料結構來維護當前合法的 B 的值即可,滿足條件的包括樹狀陣列,平衡樹等,複雜度都在 log 級別。(如果將 k 從後往前維護,可以省去 delete 操作)

總的複雜度為 O(n + qlogn)。