Leetcode 是什麼?誰需要刷題?工程師面試要刷到什麼程度?
文章推薦指數: 80 %
Algorithm; Database; Shell; Concurrency. 最常見的以演算法為主,這次的系列將著重於此。
說穿了,刷LeetCode 好比學生時代刷題庫,目的是 ...
Loading...首頁課程內容系列課程JavaScript全端開發課程學期一|程式設計入門學期二|掌握網頁開發學期三|軟體工程師養成全年開課時間表最新消息非本科跨領域學程式最新課程DATA&AI公開課SQL14天入門課學習體驗成效Blog技術主題求職攻略數據入門文章首頁FAQ常見問題關於ALPHACamp加入我們💰萬元獎學金馬上報名Web技術Leetcode是什麼?誰需要刷題?工程師面試要刷到什麼程度?Posted on 2020-11-05 by byVictor什麼是LeetCode?隨著大資工時代的到來,越來越多人憑藉著非大學課程的訓練,自己練出軟體世界的基本功,尤其以網路開發為主。
工程師本身的起薪高,容易吸引到大量的人才投入。
當好的職缺出現在求職市場時,眾多求職者將湧入其中爭取面試機會,企業使用履歷進行篩選之外,會考驗應徵者的基本開發能力以及專案經歷。
前者常見的測試方式為白板題與線上題庫測驗;後者則看求職者的作品集來了解。
而LeetCode便是常見了解題目的手段,其記錄各式各樣的題目好讓求職者有個底。
LeetCode的題庫內容有:AlgorithmDatabaseShellConcurrency最常見的以演算法為主,這次的系列將著重於此。
說穿了,刷LeetCode好比學生時代刷題庫,目的是熟悉題型好應對各式各樣的基本題與變形題。
目的只有一個,面試中遇到的技術問題可以順利通過。
軟體工程師薪水多高?2022台灣網路IT業薪資行情提到演算法自然而然會連結到資料結構。
深入來看,演算法是基於不同類型的資料結構開發出來的,即使是不同的資料結構,基本的CRUD功能是必要的,而演算法便是思索如何改善CRUD的速度。
因此,往後在工作上面對不同的需求時,使用較符合需求的資料結構,再搭配適合該結構的演算法,便能有效提升計算速度。
演算法對一個工程師的意義?如何提升實力?題外話其實刷LeetCode的需求,往往有幾種背景需要練習:學習過大學資料結構與演算法課程的學生。
想要進入大公司的求職者。
想要學習新語言特性的學習者。
題庫刷得再多也要記得,專案的能力也要一併培養。
刷很多題庫卻沒有規劃專案的能力,往往是致命的,因為題庫的能力可以藉由反覆練習獲得,規劃專案的能力卻不太能藉由反覆練習取得,因此不少資深職缺會希望求職者擁有好的專案經驗。
學習網頁開發、成為具專案能力的未來人才,3分鐘小測驗找到你成為軟體工程師的起點個人背景我不是大專院校資訊相關科系出身,自然沒有接觸過演算法與資料結構。
學習過程以網頁開發為起點,學習HTML、CSS、JavaScript,後續在公司的專案上接觸到Java與C,整個過程由簡入難。
說實在的,沒有接觸到靜態語言前,覺得全世界都用JS開發是件多美好的事情。
隨著經驗的累積後,慢慢了解每種語言因為獨特的能力而有存在的必要性。
學習Java才瞭解靜態語言與物件導向的美。
學習C才了解JS好用的內建函式,不一定是效能的最佳選擇,以及ByValue&ByReference的由來。
可見的,這系列的內容將傾向個人學習資料結構與演算法的筆記心得,力求口吻平易近人,往後自己複習時可以輕鬆讀懂、他人閱讀時也能輕鬆閱讀。
我會怎麼寫?順序是這樣的:介紹LeetCode與一些基本刷題知識介紹資料結構的特性。
列入在LeetCodeTag內的資料結構優先討論。
嘗試用JS、Java、C各解一次,目的是增進三種語言的熟練度。
演算法用來輔助資料結構。
因為我最熟悉的語言是JS,所以相關的術語概念將以JS為主。
成為軟體工程師需要哪些實戰力?申請免費5天試讀刷LeetCode該有的基本知識如果什麼都沒準備,以TwoSum來說這邊聽我娓娓道來第一次使用LeetCode的情境:註冊LeetCode帳號成功、點選Problems後,印入眼簾的是一千多題,不懂門路的我,想說過往寫題目都從第一題開始,而且難度標注是Easy,應該是沒問題可以順利解決,於是點擊TowSum。
題目的內容是這樣:Givenanarrayofintegersnumsandanintegertarget,returnindicesofthetwonumberssuchthattheyadduptotarget.Youmayassumethateachinputwouldhaveexactlyonesolution,andyoumaynotusethesameelementtwice.Youcanreturntheanswerinanyorder.Example1菜雞的我,想一下後認為使用兩個forloop就能處理了。
所以我寫出這樣的程式碼:開心地按下Submit後,得到當下只有無限的問號在我腦中,奇怪,這樣做不對嗎?重新來一遍,會如何分析TwoSum首先要仔細閱讀已知的資訊,除了閱讀題目本身的描述外,點擊RelatedTopics後會看到Array&HashTable。
對於菜雞來說,關於如何操作Array有個基本的概念,但是HashTable就不太理解,於是找尋HashTable的相關資訊,大致上有概念後,會陷入一個窘境,如何實作?想了20分鐘後仍然沒頭緒,直接找答案。
了解Hash除了常用於密碼學上,也可以應用在其他情境。
在參考解答後寫了JS的版本:說實在的,看答案後重新寫出來並不可恥,重點是學習這個問題背後要測試的技術是什麼,這邊只使用一次forloop,每次進行判斷與製作HashTable,所以可以有效地壓縮搜尋時間。
完成基本功的我想要增加其他訓練因為工作上的需求,除了平常使用JS開發之外,有時需要接觸Java與C。
趁這個機會同一題用三種語言寫寫看,藉此了解三個語言不同之處。
Java可以看出,這題因為需要的觀念是Array與HashTable,JS與Java在這部分的幾乎類似,因此程式碼十分相近。
C直覺作答,使用兩個for-loop參考Submission後嘗試製作HashTable我得承認,C的處理方式跟上面兩個語言非常不同。
撰寫過程中因為不了解只好再去找一次解答,了解更多C的相關運用。
這邊看到幾個版本:直接使用for-loop解題,玩味的地方在於C不會出現RuntimeError。
使用struct模擬JS&Java的物件好製作HashTable,接著使用twopointer的找尋答案。
不使用struct,而是用Array模擬物件製作HashTable,再用for-loop一個一個找尋。
C實在是太有趣了,同一題居然有多種寫法,而且執行的結果跟JS有不小的差距。
從不能用暴力解(BruteForce)這件事來看,LeetCode希望大家寫出有效率的運作模式。
而有效率到底該怎麼判斷?Leetcode如何測量效率在我還是個剛轉職成功,沒有實際接觸過複雜專案的菜雞時期,面對新功能的開發,心態上保持著先求有再求好,寫出許許多多用了不同內建函式、自訂函式的程式碼。
新功能當然是順利開發成功,為此感到十分開心。
這時候的我,對於能完成新功能開發的自己,感到十分得意。
工作經驗增加後,有機會碰到公司內較複雜的專案,藉此打開我的眼界,程式碼的部分沒有毫無章法的寫法,反倒是有一定規律的做法(現在的我知道這是DesignPattern),當時我負責接觸的部分是效能優化的部分,這時候才感覺到沒有思考每種資料結構特性,胡亂使用順眼的函式執行,是一件多麽可怕的事情。
回憶結束。
關於程式碼的效率,可以從兩個角度來思考:執行速度可以多快?執行時期記憶體使用量有多少?新手工程師如何提升「程式碼品質」?程式執行效能更好、程式碼結構更精簡的關鍵菜雞時期接觸的專案,鮮少有大數量(萬筆以上)的資料庫,或是每天接受的Request數量到達幾十萬甚至是幾百萬。
因此在處理資料上都是小數量為主,任何的函式在執行上看不太出來效率的差異。
但是,真實世界,尤其是開發逐漸上軌道的產品,不可能面對小數量,而是讓人無法有人平估的大數量。
是否善用資料結構與演算法來優化產品的邏輯運算,在這個時候就派上用場了。
當然,除了優化處理效率外,還有許多跟部署有關的技術可以優化大數量的Request,這不在本文討論的範圍內。
回到主題,判斷執行速度與記憶體的使用,可以這樣理解:時間複雜度,TimeComplexity強調需要執行的次數。
專業上的講法會提到測量方式、測試次數的加總以及如何用BigO表達,個人傾向簡單講解,面對一組資料,用for-loop執行嗎?假如面對多組資料,能避開巢狀for-loop嗎?有想過在for-loop調整執行的內容,好減少執行的次數。
空間複雜度,SpaceComplexity強調變數的使用量。
專業上的講法會提到執行時要佔用的記憶體空間,個人傾向簡單講解,面對一組資料,是否要額外宣告變數來處理?變數的數量可以控制嗎?twosum這題該怎麼看待暴力解時間複雜度的部分,第一個迴圈,陣列內每一個項目都要被執行一遍,所以執行次數是nums.length,在分析時習慣用N表達。
針對陣列內每一個項目,會需要第二個迴圈,執行次數是nums.length-1,分析用N-1表達。
因此這題的時間複雜度是:空間複雜度方面,沒有額外宣告任何變數。
因此,暴力解在執行時間方面會是O(N^2),記憶體方面幾乎沒有大負擔。
使用HashTable時間複雜度的部分,僅僅只有一個迴圈,執行次數是nums.length。
因此這題的時間複雜度是:O(N)。
空間複雜度方面,額外宣告HashTable,隨著N的數量增長,HashTable內的資料量將跟著成長。
因此,HashTable在執行時間方面會是O(N),記憶體方面則有負擔。
題外話這題嘗試用不同語言撰寫,有趣的地方在於,我直覺認為靜態語言就是比動態語言快速,殊不知C#賞我一巴掌,而記憶體的使用方面,Java與C#也賞我兩巴賞。
這邊有幾點可以推論:這題的寫法,在記憶體的存取方面,對於Java與C#有比較大的負擔。
LeetCode官方的模擬環境,與我認知的不太一樣。
Golang出人意料的快速,怪不得Google自誇是21世紀的C語言。
就我個人經驗而言,撰寫JS與Java的時候幾乎沒在管記憶體,追求的只有更高的效率。
直到接觸用C開發的機器,被free給嚇到,給我一個機會省思過度宣告變數的好壞。
結語任何專業領域都一定有測不準原理的窘境,在程式設計的便是記憶體與時間的抉擇。
拜摩爾定律協助半導體產業的發展,記憶體朝向大儲存量與低廉價格發展,使得空間複雜度變成次要,時間複雜度成為主要關注的重點。
最典型的運用便是各式各樣的網頁,使用者不能忍受3秒以上的等待,於是瀏覽器們著重在使用記憶體,好帶給使用者快速的體驗。
那有著重空間複雜度的場合嗎?有的,在部分伺服器、嵌入式系統等,提供的是有限的記憶體,此時該思考如何在有限的記憶體下,爭取到多少時間?當然,目前各大公司提到演算法時,仍舊著重在時間複雜度,記憶體的問題在特定產業才有可能遇到,因此,寫出能夠快速執行的程式碼幾乎是各大公司要求的基本功。
(本文作者是AC助教Victor,轉載自他的鐵人賽系列文你總是躲不掉的,不如放膽面對LeetCode吧)8週養成軟體工程師實戰力,手刀申請試讀
更多技術學習資源
前端
JavaScript|HTML/CSS|Bootstrap|RWD|DOM|API|AJAX|Postman|jQuery
後端
HTTP/HTTPS|Node.js|MongoDB|Git|SQL/NoSQL|Docker|React
其他
VSCode|WebApp|Leetcode
Victor繞了一圈才了解自己喜歡資訊的世界,從全端工程師到系統工程師,一路走來發覺任何挑戰都能豐富自己的閱歷。
閒暇之餘藉由閱讀拓展認知邊界,增加對世界的熱愛以及對生命的體悟。
SeeAllPostleetcode演算法技術面試Search熱門搜尋自學程式學習方法學習教練助教跨領域職涯軟體工程師前端全端AllCategoriesAC動態AC評價Web技術人物專訪程式學習自學能力資料科學軟體職涯FollowUs延伸閱讀更多好文章推薦給你!Web技術Mongodb介紹:從安裝到啟動基本操作教學Web技術React是什麼?給新手的React入門Web技術React教學,系統性學習React的步驟Web技術CSS教學:認識語法規則與基本功Web技術演算法(Algorithm)是什麼?演算法應用的例子與場景Web技術助教開講活動回顧:網頁開發必學技巧不藏私公開Web技術LeetCode解題的思考策略,刷題的4個階段Web技術什麼是Scrum?認識Scrum的做法與它的限制ALPHACamp的使命是「幫助人們發展有意義、有價值的職涯」。
自2014年以來,我們以新加坡和台灣為教學據點,培訓超過6500名學員。
校友遍及台灣、新加坡、中國、以及全球的科技新創。
JavaScript全端開發課程三學期系統化課程設計學期一:程式設計入門學期二:掌握網頁開發學期三:軟體工程師養成最新課程New數位職涯RPGDATA&AI公開課SQL14天入門課LearnMore非本科跨領域學程式理工科職涯升值挑戰學習體驗成效Blog技術主題職涯攻略常見問題關於ALPHACamp加入我們ContactUsEmail:[email protected]電話:+886-2-2546-9766(※防疫期間AC採遠距上班,如需聯繫請來信或FB私訊)地址:105台北市復興北路201號6樓之4獲取最新資訊業界經驗分享、職涯諮詢、學習技能提升!訂閱電子報ALPHACamp|創新職涯的線上學校©2022AllRightsReserved
延伸文章資訊
- 1Leetcode 是什麼?誰需要刷題?工程師面試要刷到什麼程度?
Algorithm; Database; Shell; Concurrency. 最常見的以演算法為主,這次的系列將著重於此。 說穿了,刷LeetCode 好比學生時代刷題庫,目的是 ...
- 2什麼是LeetCode? - 一個人的文藝復興- Medium
LeetCode是一個收集軟體工程師面試考古題的線上練功網站。 (文章同步刊登於部落格,閱讀體驗更好) · LeetCode. Level up your coding skills and q...
- 3[ALG101] 先別急著寫leetcode - Lidemy 鋰學院
如果你刷題刷得很快樂,覺得沒碰到什麼障礙,而且程式能力的確有提升,那當然可以開開心心繼續刷題。但我知道有些人一定不是這樣。 有些人光是leetcode easy 的題目就可以 ...
- 4记录自己的leetcode解题之路。 - GitHub
LeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解,记录自己的leetcode解题之路。) - Git...
- 5[番外篇] 解LeetCode 之前 - iT 邦幫忙
LeetCode 是一個收集軟體工程師面試題目的網站。也就是說假如你全部刷完,那在google、facebook 這種公司上班也不是難事了! 等等,不要高興的太 ...