iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 1
3
影片教學

演算法升級術 — LeetCode 挑戰賽系列 第 1

[Day00] 前言 - 關於系列文

自我介紹

哈摟,大家好,我是小碼農米爾,其時我加入 it 邦蠻久了,之前一直沒有修改暱稱,使用的是 「fysh711426」 這個帳號,不過今年發生了一些事,這裡就不說了,所以想給自己一個新的名子,重新開始。希望小小碼農,有一天也能用程式改變世界。

新技術焦慮症與建議

在這個框架、技術大爆發的時代,你是否也得了「新技術焦慮症」,不停的學習新技術、新框架,但內心卻還是感到非常焦慮呢?

遇到這種情況,不妨先停下腳步休息一下,有時候休息是為了走更長遠的路,不需要和別人比較,按照自己的步調去學習、累積,時間拉長一點你會發現原來我進步了這麼多!! 只要今天的自己比昨天更進步這就足夠了

當你學習一門新語言或新框架時,是否感到有些吃力? 或需要花很多的時間才能學會? 如果有那可能是你的基本功還不夠紮實 (給大家一個參考,可能不適用於每個人),這時建議可以回頭去加強基礎的部分,等基礎紮實以後,再去看新語言或框架,你會發現學習的效率提高了不少,程式語言和框架其實只是一套抽象思考的方式,當基本功紮實以後,可以比較容易的抓到重點或差異,學習起來自然就會輕鬆許多。

小結,學習上我會建議,基礎科目和新技術可以交替學習,如此才能維持一個平衡,兩邊穩定成長、進步。

選擇新語言時的建議

每次選擇新語言時,除了工作需求之外,建議可以稍微看一下該語言的特性,是否對自己有所幫助,例如:

  • C++: 語法偏底層、指標、記憶體管理
  • C#: 語法優雅、物件導向、運算式樹、非同步模型、LINQ
  • JS: 語法靈活、前端必學、一級函數、閉包、原型鏈、範圍鏈
  • Python: 語法簡潔、AI 必學、生成式、切片、解構、Numpy、Pandas

目前主修這四種語言,其他的就沒辦法多給建議。


https://ithelp.ithome.com.tw/upload/images/20200916/201068656lKWb4LTEg.jpg

為什麼要學演算法

回到主題,我把基本功分為五個部分 (如上圖)。藍色區塊的基本邏輯和物件導向屬於「基礎部分」,他們延伸出去的橘色區塊則屬於「進階部分」。

在程式初學階段,通常會從藍色區塊開始學起,我們會先選一門喜歡的語言,然後學習基本的程式邏輯,條件式、迴圈、陣列、函數,如果語言有支援物件導向,就會開始接觸,類別、繼承、多型、泛型、等等...,所以歸類為基礎。

接下來為了解決更複雜的問題,就會需要學習「資料結構」、「演算法」,這兩門學科主要是教我們如何將資料變成抽象結構,和評估程式的效能,因為他們比較偏向基本邏輯的更複雜組合和運用,所以我定義為基本邏輯的延伸。而「設計模式」也是相同的概念,是物件導向的更複雜組合和運用,所以我將其定義為物件導向的延伸,三者歸類為進階部分。

為什麼要學演算法? 其實進階項目都很重要,但因設計模式在工作上用到的比較少 (我自己的經驗),所以我會推薦把更多的時間投資在資料結構和演算法上,想要寫出效能優異的程式,這兩門學科是一定要學好學滿的!!!

影片教學 x LeetCode

實作是提升程式能力最快的方式,演算法也不例外,所以這次我以會以 LeetCode 挑戰賽的題目為主題,通過實際的解題過程,和大家一起學習演算法和資料結構。

而為什麼想製作影片教學呢? 一是想挑戰自己,學習不一樣的新事物,二是資料結構和演算法常讓人們覺得艱澀難懂或是枯燥乏味,所以希望能透過影片配合簡單的動畫呈現,讓教學有趣一些,且方便大家理解、加深記憶。

第一次嘗試製作影片,還有很多需要改進的地方,還請各位大大鞭小力一點。
(́◕◞౪◟◕‵)*

發文時間

由於影片製作時間比較長,發現日更完全不可能,所以果斷放棄,大概會像去年一樣吧,半年後還在發文這樣... ((完全無視比賽規則。 ╰( ̄▽ ̄)╭

目錄

  • [Day00] 前言 - 關於系列文
  • [Day01] 什麼是二元搜尋法
  • [Day02] 不重複元素的資料結構 Set
  • [Day03] 用於計數的字典 Counter
  • [Day04] 如何計算不包含前導零的補數
  • [Day05] 如何將字元對應到陣列上
  • [Day06] 什麼是摩爾投票法
  • [Day07] 如何使用佇列進行廣度搜尋
  • [Day08] 如何使用外積公式判斷座標是否共線
  • [Day09] 如何判斷完美平方數
  • [Day10] 找到祕密的小鎮法官
  • [Day11] 如何使用遞迴進行二維陣列的走訪
  • [Day12] 如何找到單獨出現的數字
  • [Day13] 小朋友才做選擇,我全都要的貪婪法
  • [Day14] 如何實作一顆字典樹
  • [Day15] 什麼是 Kadane's 演算法
  • [Day16] 如何對鏈結串列的奇偶元素進行分組
  • [Day17] 如何使用滑動視窗法進行字串比對
  • [Day18] 雙指標版的滑動視窗法效能更好
  • [Day19] 先進後出的資料結構 Stack
  • [Day20] 如何對二元樹進行中序走訪
  • [Day21] 如何使用動態規劃計算子矩陣數量
  • [Day22] 好用的 most_common 函數
  • [Day23] 如何判斷兩區間是否交集
  • [Day24] 如何使用分而治之法建立二元樹
  • [Day25] 如何使用動態規劃計算最長共同子序列
  • [Day26] 如何使用對稱的方式找到最長連續子陣列
  • [Day27] 如何使用二分圖將資料進行分組
  • [Day28] 如何計算二進制中 1 的數量
  • [Day29] 如何使用拓墣排序檢查圖形中是否存在循環
  • [Day30] 今天來聊聊什麼是 Lambda 運算式
  • [Day31] 如何使用 lru_cache 裝飾器快取遞迴結果

結語

感謝大家觀看,我們下次見。 (To be continued.)


下一篇
[Day01] 什麼是二元搜尋法
系列文
演算法升級術 — LeetCode 挑戰賽8

2 則留言

0
cathywen14
iT邦新手 5 級 ‧ 2020-09-17 17:18:47

每次想到F大這麼享受程式,煩躁的心就會慢慢穩定下來呢! 期待這次的影片教學!/images/emoticon/emoticon12.gif

哈哈哈,加油加油!!!

0
暐翰
iT邦大師 1 級 ‧ 2020-09-21 19:31:22

置板凳,等影片 /images/emoticon/emoticon43.gif

/images/emoticon/emoticon41.gif

我要留言

立即登入留言