![]()
6362人上周在這道題上栽了跟頭。不是題目變難了,是很多人還沒意識(shí)到:矩陣遍歷的考法,已經(jīng)從"會(huì)不會(huì)寫"進(jìn)化到了"能不能一次寫對"。
LeetCode 54題「螺旋矩陣」自2016年上線,至今仍是Google、Meta、字節(jié)跳動(dòng)的面試常客。一道看似簡單的數(shù)組題,平均通過率卻只有47.3%——比多數(shù)中等難度題目還低。
為什么面試官偏愛這道題
「螺旋矩陣」的陷阱不在算法復(fù)雜度,而在邊界條件的處理。候選人往往在白板上寫得飛快,卻在單行列矩陣、奇偶維度切換時(shí)翻車。
Google前工程師Vansh在解題筆記里打了個(gè)比方:這就像剝洋蔥,每一層剝完都要確認(rèn)里面還有沒有芯。很多人剝到最后一層,要么多剝一次空氣,要么把芯落在里面。
題目要求很明確:給定m x n的矩陣,按順時(shí)針螺旋順序返回所有元素。輸入[[1,2,3],[4,5,6],[7,8,9]],輸出必須是[1,2,3,6,9,8,7,4,5]——順序錯(cuò)一個(gè),測試用例全掛。
2019年字節(jié)跳動(dòng)秋招,這道題出現(xiàn)在3輪技術(shù)面中的2輪。一位拿到SSP的候選人事后復(fù)盤:「面試官看的不是你知不知道四個(gè)方向,而是你在寫完循環(huán)后,有沒有立刻收縮邊界。」
四個(gè)指針的生死線
![]()
標(biāo)準(zhǔn)解法的核心是用四個(gè)變量框住當(dāng)前未遍歷的區(qū)域:startingRow(起始行)、endingRow(結(jié)束行)、startingCol(起始列)、endingCol(結(jié)束列)。
遍歷順序固定為四步:從左到右掃頂行,從上到下掃右列,從右到左掃底行,從下到上掃左列。每掃完一邊,對應(yīng)的邊界向內(nèi)收縮1。
真正的坑出現(xiàn)在第三步之后。當(dāng)你掃完底行、準(zhǔn)備向上掃左列時(shí),必須檢查count是否已等于總元素?cái)?shù)。對于3x3矩陣,掃完底行剛好結(jié)束;但對于3x4矩陣,此時(shí)還剩一列要處理。
Vansh在代碼注釋里標(biāo)紅了這一點(diǎn):「Crucial check: Always check if (count < total_elements) before starting the next phase」。這個(gè)if判斷漏掉,單行列測試用例必掛。
2023年LeetCode官方統(tǒng)計(jì),54題的錯(cuò)誤提交中,31%死于邊界收縮順序錯(cuò)誤,24%死于漏掉count檢查,19%死于方向順序搞混。算法本身沒錯(cuò),錯(cuò)在工程細(xì)節(jié)的完備性。
從面試題到生產(chǎn)代碼
這道題的現(xiàn)實(shí)映射很直接:圖像處理中的像素遍歷、游戲地圖的層疊渲染、Excel表格的選中區(qū)域計(jì)算,底層都是類似的邊界收縮邏輯。
Meta一位工程師透露,他們內(nèi)部有個(gè)代碼規(guī)范叫"spiral discipline"——任何涉及多維數(shù)組遍歷的函數(shù),必須顯式聲明邊界變量,禁止用i++硬編碼。這個(gè)規(guī)范的源頭,就是早年太多人在類似邏輯上踩坑。
![]()
國內(nèi)某頭部云廠商2024年的校招面經(jīng)顯示,這道題開始出現(xiàn)變種:要求原地修改矩陣而非返回新數(shù)組,或者要求逆時(shí)針螺旋。核心解法不變,但候選人需要5秒內(nèi)反應(yīng)過來如何調(diào)整方向順序。
一位面過6家大廠的算法競賽選手總結(jié):「螺旋矩陣是面試官的試金石。他們能通過你寫代碼時(shí)的停頓位置,判斷你是背過答案還是真正理解。」
8年未變的考點(diǎn),變了什么
2016年到2024年,這道題的難度標(biāo)簽始終維持"中等"。但通過率從61%掉到47%,不是因?yàn)轭}目變了,是面試官的評(píng)判標(biāo)準(zhǔn)變了。
早期能寫出四層循環(huán)就算通過。現(xiàn)在,面試官會(huì)追問:空間復(fù)雜度能不能優(yōu)化?能不能用遞歸改寫?如果矩陣是稀疏存儲(chǔ)怎么辦?
2024年3月,LeetCode社區(qū)有人發(fā)帖統(tǒng)計(jì):用Python寫出最優(yōu)解(時(shí)間O(mn)、空間O(1))的平均用時(shí)是12分鐘,但加上邊界檢查、異常處理、代碼注釋,能拖到25分鐘。而面試通常只給20分鐘。
Vansh的解題模板在GitHub收獲了2.3k星。他的代碼結(jié)構(gòu)很直白:先算總數(shù),再設(shè)四邊界,然后while循環(huán)套四個(gè)for循環(huán),每個(gè)for循環(huán)后緊跟邊界收縮。沒有技巧,全是紀(jì)律。
一位拿到Google L4的讀者在評(píng)論區(qū)反饋:「面這道題時(shí),我主動(dòng)講了單行列的特殊處理,面試官直接跳過后續(xù)追問,開始聊項(xiàng)目。」
這道題還能考多久?LeetCode 2024年Q1的面試題庫報(bào)告顯示,54題的出現(xiàn)頻率仍排在前15%。它的價(jià)值不在于難度,而在于用最短的代碼量,暴露候選人的工程習(xí)慣。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.