iT邦幫忙

2021 iThome 鐵人賽

DAY 30
3
Software Development

LeetCode 雙刀流:Python x JavaScript系列 第 30

LeetCode 刷題的只是寫好程式的第一哩路

什麼是 LeetCode?

「什麼是 LeetCode?」是整個鐵人賽系列文章的第一個主題,你現在會怎麼會回答這個問題呢?

▶ LeetCode 是一個線上解題系統
▶ LeetCode 是一個持續鍛鍊資料結構和演算法的平台
▶ LeetCode 是一個軟體公司技術面試題的線上題庫

這些答案都沒錯,LeetCode 不僅僅是一個線上解題系統,他能夠滿足你不同階段的程式進修。不管你是「時間有限的密集衝刺」、「搭配理論課程練習」還是「想長期持續鍛鍊程式基礎功」,LeetCode 平台都能夠提供你適合的練習與使用策略。寫程式不只是學習程式語法,更需要搭配實作練習,而 LeetCode 就像程式世界的單字本,隨時都可以拿起來練習或是玩一下。

接下來,就大家一起回顧我們這三十天講了哪些東西吧 ヾ(´∀`)ノ

① 刷題前的正確姿勢

在開始正式進入刷題的練習之前,會建議你從「為什麼要刷題?」這個問題開始出發。我認為不管做什麼事情,「動機」都是驅動一件事情是否成就的重要來源。就像沒有報名鐵人賽,怎麼會連續寫出三十篇的技術文呢?所以在這一個階段大概聊了幾個議題:

  • 什麼時間點該考慮 LeetCode 刷題?
  • 幾種常見的解題策略與刷題順序
  • 刷題過程的心態與技巧
  • 看懂題目背後的設計思維
  • 如何衡量程式的好與壞?

為什麼要刷題? 最核心的目的是能夠讓你自然的寫出「更好的」的程式碼,所以心中必然有一個追逐更好的渴望,不論你的動機為何。而我們會把刷每一個題目的過程分成四個階段,「動手之前先思考 → 初探直覺解 → 刻意優化 → 舉一反三」。

這個其中最關鍵的核心在於 持續優化 的思考過程,寫程式是的世界中「沒有最好,只有更好」,唯有把持續優化這個想法放在心裡面,永遠提醒自己不要甘於寫出一個「會動的程式」就好,要追求的是
如何寫出「漂亮的程式」。

② 各種資料結構與演算法的解題脈絡

從「如何理解題目背後的設計思維」到「看懂題目背後的設計思維」,其實就是一種寫出更好的程式碼品質的過程。所謂好的程式背後所代表的即是「資料結構」與「演算法」的使用,掌握好資料結構與演算法讓你的程式寫得更漂亮。在這整段過的過程中,我們一起從理解完題目到開始實作,每一個題目一起嘗試「#初探直覺解」並且一起體驗「#刻意優化」的過程。「如何最大化一個題目的效益」也是刷題過程中重要的關鍵,如何從一個盡可能地持續迭代、持續優化並且思考沈澱。

從「資料結構」的技巧切入:

  • 從內建容器到善用資料結構特性
  • 線性與非線性的資料結構
  • 從「遞迴」策略遷移到「堆疊」暫存
  • 資料存取的先後順序:Stack 和 Queue

從「演算法」的策略切入:

  • 遞迴函式與回溯法優化
  • 各式各樣的演算法 - Greedy、Dynamic Programming 與 Divide and Conquer
  • 刷題後的歸納與淬鍊 - 常見的解題技巧「模板」

不過我們這一段的過程,我們其實是先從「題目」出發再歸納整理出技巧。主要的原因是,我們都會先從「窮舉法/暴力法」這種相關直觀但沒那麼漂亮的方法開始解,再從中思考可以優化的空間,進一步從優化的空間帶入資料結構與演算法的是什麼。

③ 除了刷題之外的事

「程式設計」的練習是一種從「寫得出」程式到「寫得好」持續迭代的優化過程,刷題是練習 解決問題的能力 的一種方法,而這裡的「問題」主要是指 演算法問題 。但在實務的工作場景當中,「演算法問題」只是程式工作的一小部分而已。我們除了在意「一個問題中的算法怎麼解之外」,我們更在意的「如何把這些算法實現成完整的應用」。因此除了刷題之外的事是如何用「工程化」的方式解決一個真實問題,最後三天一起聊聊除了刷題之外想寫好程式還有以下幾個技能需要掌握:

  • 軟體工程 (Software Engineering)
  • 專案管理(Project Management)
  • 系統架構(System Architecture)

總結來說,雖然我們是以 LeetCode 刷題為主的技術分享。不過 LeetCode 刷題的只是寫好程式的第一哩路,比起你刷個多少題、學會了多少技巧,更重要的是希望你能夠把個「持續優化」的信念放在心上。追逐程式實作技巧也許短期內會覺得很刻意,但立志寫出一個精簡高效的程式才是身為一個工程師該有的浪漫。


嗨,大家好!我是維元,一名擅長網站開發與資料科學的雙棲工程師,斜槓於程式社群【JSDC】核心成員及【資料科學家的工作日常】粉專經營。目前在 ALPHACamp 擔任資料工程師,同時也在中華電信、工研院與多所學校等單位持續開課。擁有多次大型技術會議講者與競賽獲獎經驗,持續在不同的平台發表對 #資料科學、 #網頁開發 或 #軟體職涯 相關的分享,邀請你加入 訂閱 接收最新資訊。


上一篇
除了刷題之外的事 - System Architecture
系列文
LeetCode 雙刀流:Python x JavaScript30

1 則留言

0
TD
iT邦新手 4 級 ‧ 2021-10-31 11:42:14

我看完了,謝謝 WeiYuan 三十天精彩的分享!

我要留言

立即登入留言