前言這篇文章不是一個資深軟體工程師給新手的建議,也不是一個如何拿到頂尖公司offer的方法,這是來自一個LeetCode初學者的經驗分享。也許藉由我這個剛起步不久、沒什麼經驗、刷題數甚至不到100題的人來分享剛入門的經驗,能夠讓跟我處在相同階段的人多一點信心。讓你知道,除了你在網路上找到那些動輒500題、甚至千題以上解題經驗的大神,又或是一路過關斬將,offer拿到手軟的強者之外,也有像我這種,解easy花三小時解到崩潰哀哀叫的人在。接下來我會分享我的解題與面試經驗,以及兩個我在練習前期陷入的瓶頸,希望能夠幫助跟我處在差不多階段的人。首先附上人權Coding Interview 經驗三次線上的coding test,都是自己在家中線上解題,不需要與面試官互動,結果是都沒上。第一次 趨勢科技還沒寫過LeetCode,想說大學研究所都有寫過程式,可以直接試試看,結果幾乎都不會寫。第二次 新思考C++,那時很認真準備,解題狀況還不錯,五題只有一題沒跑過所有test case。第三次 新加坡 鈦坦考C++, SQL, Rest API(大概吧,老實說我連題目都沒看懂),那時忙著趕論文疏於練習,C++的題目應該是easy,但我當下大腦直接打結,結果一題都沒寫出來。起步2022下半年,碩二上學期,因為看到了Google的校園徵才消息而因緣際會開啟了刷題之旅。此時心態是帶點FOMO(fear of missing out)的,因為網路上大部分找到的心得分享各個都是大神,深怕自己不趕快練習會找不到工作。我依照原子習慣、刻意練習的原則還有剛學到的專案管理方法制定了練習計畫與目標,希望藉由持續且高品質的練習,能讓我快速的掌握演算法以及資料結構。訂定計劃是個不錯的起步,但很快實際練習情況的挫折就排山倒海的襲來。接下來就分享我在練習中遭遇到的問題,以及我目前的解決方法。目前遇到的幾種問題大致可以分為兩類:基礎知識不足太過刻意練習基礎知識不足我依照計畫,點開題目就開始寫。但很快就發現,我根本不知道從何處著手,有些題目在讀完題目後,腦袋可能會有個朦朧的解題輪廓,但大部分的情況是讀完題之後,完全沒有想法。我當時的狀況,好比沒上過高中課程就直接拿學測、指考歷屆試題來寫,每一道題目對我來說都是互相獨立的,我在這個過程中歸納不出題目背後某些可能的關聯性,比如說類似的模式、相似的演算法或資料結構。雖然每題都有解答,但看完解答後,學到的東西就只能拿來解這題,沒辦法把背後的原理延伸到其他題目。這是直接使用bottom-up learning會帶來的缺點:缺乏對知識系統和結構化的學習,導致難以將所學應用於更廣泛的領域或理解問題的更深層次。為此我改變了學習計畫,我利用AlgoMonster補足了前期的基礎知識不足,AlgoMonster把各種熱門的演算法與資料結構拆解成更細小的章節,一個步驟一個步驟的引導解題的思路、流程,剖析題目背後的模式,最後再讓你實際下去解題,算是一種top-down learning 的方式。經過AlgoMonster的練習,我對各種題目的掌握度高了不少,這包括更容易辨識題目是在考哪種演算法或資料結構,以及能夠從大腦中提取該解法的實作模式,結合top-down 與 bottom-up 的學習方式提升了不少成效,算是帶我跨過了初期的瓶頸。太過刻意練習前面提到,我參考了原子習慣以及刻意練習的內容。但後來我發現,部分對於刻意練習原則的誤用,反而拖累了我的練習狀況。刻意練習強調,如果在練習的過程中感到痛苦和挫折,那正是你在學習與成長的時機。因此,我在練習初期,刻意的不尋求任何輔助資源,不看提示、不查資料,因為在沒有任何幫助的情況下解題時超級痛苦,解個easy的題目花了三個小時以上都是常有的事,而我把它視之為學習與成長的必經之路,心想我解的這麼痛苦,一定可以進步飛快吧。然而,正是這樣的痛苦,讓我漸漸地對開始寫LeetCode感到畏懼,也因為解題時間拉太長,如果沒有充裕的時間,我就不想打開LeetCode刷題,這間接違反了原子習慣的原則,當執行習慣的難度過高,很容易讓自己產生拖延。運氣很好的,ChatGPT的誕生解救了我。ChatGPT可以超大幅度地降低LeetCode的學習門檻,他相當於一個私人家教,能夠根據你的狀況回答問題,這是過去LeetCode社群討論區或是Google搜尋沒辦法做到的事情。像我常常會照著自己的思路解題,寫到後面發現遇到瓶頸卡住,但是到討論區卻發現沒有人跟我的解題思路一樣,所以沒辦法得知為什麼我的方法不好或是錯在哪裡。下列是幾種ChatGPT的使用情況程式優化。程式除錯。計算Big O。解釋程式碼。扮演coding interview面試官與之互動、討論。給予解題提示、引導而不直接給解答。能夠客製化的回答問題真的是很可怕的能力,這能縮短超級多卡關的時間,並且得到更即時、有幫助的回饋。最後分享一下我的解題流程,釐清流程可以幫助自己找到哪個環節是弱項並加強。仔細讀題、限制條件。根據對題目的理解,條列一些重點包括:可能會用到的演算法、資料結構,可能要注意的special case,可能可以幫助提升效率的題目細節。寫下大致流程並思考解法的時間、空間複雜度 (Option:與ChatGPT討論解題思路,看看要繼續使用這個方式解題,亦或是需要換個思路)。在紙上寫下實際的程式碼、並檢查與上一步驟寫下的流程是否一致。挑幾個test case,逐行走過程式碼檢查是否能依照預想的運行。在LeetCode頁面實作程式碼,並視情況增加test case。不管提交成功與否,都可以把程式碼貼給ChatGPT看是否有優化的空間。最後,記得設定解題時間,沒解出來就認輸尋求解答,並存下題目日後再回來練習。我認為這個限制蠻重要的,才不會讓自己無限的延長解題時間,形成拖延。區分解題流程,可以幫助自己很快速地分析自己的缺點,後續比較容易針對這些弱項做加強。舉例來說,剛開始練習時,我很常卡在流程三,因為缺乏基本的演算法、資料結構知識,所以我沒辦法辨識題目可能要考的面向,或是寫出相對應的演算法,而這個部分在我經過AlgoMonster的練習後就大幅地改善了。另一個很常卡住的環節是流程四的把解題思路轉換成實際的程式碼、debugging、優化,這部分透過ChatGPT的輔助就可以讓自己不會卡在同一個瓶頸太久。總結這篇文章與其說是經驗分享,其實更像是在與自己對話。從開始練習到現在大概過了半年,我認為我的練習進度並不快,經驗也不算豐富,但如果等到出關了才回頭寫下文章,很可能早已忘記早期經歷過的掙扎。下面總結一下文章一開始不要直接刷題,先對演算法與資料結構有一定認知與實作能力後再開始也可以。bottom-up 加上 top-down learning 可以帶來更好的學習效果。使用ChatGPT輔助解題流程,降低難度。訂定解題時間,如果超過時間就放棄看解答,可以儲存題目,日後再回頭解一次。不要無限延長解題時間。區分解題流程,比較容易找到並針對自己的短處做加強。不需要FOMO。如果你也才剛起步,歡迎留言讓我知道自己不孤單。Photo by Tai Bui on Unsplash