這次 Google 2026 New Grad OA 確實換新題了,感覺題庫終於開始動了。整體難度不算特別刁鑽,但思考方向如果跑偏,其實挺容易浪費時間。流程還是老樣子,拍照驗證之後直接開做,前後大概十分鐘就把主體寫完了。提交後系統又補了兩個 test case,算是小小壓力測試,好在思路本身比較穩,最後順利 AC。簡單說下兩道題的核心解法。
Coding 1
給定一個陣列 A,表示學生的身高。所有學生需要排成若干隊伍,學生會按照陣列中出現的順序依次到達。對於第 i 個學生,如果存在一支隊伍,其中所有學生的身高都高於 A[i],那麼該學生可以加入其中任意一支隊伍;如果不存在這樣的隊伍,則該學生需要新建一支隊伍。你的任務是計算最終最少會建立多少支隊伍。
請編寫一個函式:給定一個非空整數陣列 A(長度為 N),返回最少建立的隊伍數量。
解題思路
這題本質是在維護若干個“隊尾嚴格遞減”的隊伍。每來一個學生,就去找當前隊伍中隊尾身高大於他的那一排,並儘量把他放進去,這樣可以給後面的學生留下更多空間。如果沒有符合條件的隊伍,就新開一排。實現時可以用一個陣列記錄每排的隊尾,並保持有序,然後透過二分查詢找到第一個大於當前身高的位置進行替換;找不到就追加新隊伍。整體是一個典型的貪心 + 二分維護單調結構(LIS 變形),時間複雜度可以做到 O(n log n)。
Coding 2
有若干需要執行的程序。每個程序對執行它的伺服器會產生一定的負載,該負載由一個整數表示。伺服器的總負載等於其上所有程序負載之和。現在你有兩臺伺服器可供使用,需要將所有程序分配到這兩臺伺服器上,使得它們的總負載差的絕對值最小。
請編寫一個函式:給定一個包含 N 個整數的陣列 A,其中每個元素表示對應程序的負載,函式應返回兩臺伺服器負載差的最小絕對值。
解題思路
目標是讓兩臺伺服器的負載儘可能接近,因此可以把問題轉化為:從陣列中選出一部分程序,使它們的總和儘量接近所有負載和的一半。設總和為 S,只要找到一個子集和最接近 S/2,最終差值就是 S - 2 * subsetSum。這是非常典型的0/1 揹包 / 子集劃分問題:用布林 DP 判斷某個和是否可達,從 target = S/2 往下尋找第一個可行值即可。時間複雜度通常為 O(n * S),在資料範圍不極端的 OA 場景下完全可行。
Google 26 NG SDE OA 體驗分享
順便說一下這次 OA 的整體體驗。我這場是找了 programhelp 做全程 OA輔助 ,幫我省下了不少來回試錯的時間。尤其是這種需要迅速識別題型的 OA,有人在關鍵點提醒一下方向,和自己硬想的效率完全不在一個量級。最後提交後補測的 test case 也都穩住了,沒有出現反覆修改的情況,整體做下來心態會輕鬆很多。如果你最近也在準備 Google 或其他大廠 OA,提前把這些不確定因素降下來,其實透過率會高不少。