iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 17
1
Software Development

30天全端手把手學徒計畫-前後端整合之旅系列 第 17

[守] 你需要的是資料結構, 演算法與物件導向概念的加持

之前有說過我們團隊每週會刷leetcode,幾乎1000題內都是在考資料結構+演算法,資料結構像是你身上裝備的武器,而演算法則是你真正的武功。而物件導向/設計模式像是魔法一樣,讓你程式寫得更漂亮精簡。

例如上週P同學所帶來的這題:
https://leetcode.com/problems/valid-parentheses/

leetcode的題目乍看都不難(如果英文還ok的話,不ok就是順便練英文),要盡可能先把題目讀懂。也不要刷題時有壓力,並不是為了面試,而是去動腦去玩程式碼。每個人寫出來的都不一樣,這就跟藝術創作一樣,沒有絕對答案。是很有趣的。

這題答案如果知道一個關鍵資料結構,基本上秒解。

var isValid = function (s) {
    const ar = s.split("")
    let stack = []
    for(let i=0;i<ar.length;i++){
        if(ar.length != 0 && (
            (stack[(stack.length - 1)] === "(" && ar[i] === ")") ||
            (stack[(stack.length - 1)] === "[" && ar[i] === "]") ||
            (stack[(stack.length - 1)] === "{" && ar[i] === "}") )){
            stack.pop();
        } else {
            stack.push(ar[i]);
        }
    }
    return stack.length === 0
};

這一題資料結構就是stack,如果這題不用stack去解決,可能就要搞很久了。然後再搭配先進先出排程演算法,逐一拆解字串到陣列,因為只有三種括號類型,且跑一次迴圈,時間複雜度為O(n)。


很多人不知道怎麼訓練自己的程式技巧。如果你都還不知道資料結構中的Queue、Stack或Linked List有什麼不同,sort有哪幾種的話,那絕對不是一直刷題就能增進程式技巧。

馬步還沒打穩,就想學降龍十八掌?

如果非本科系,建議直接回學校大學部修課,可以申請在職進修或者假日班,價格親民;或者直接像逃學威龍電影一樣,混進學校旁聽就好,這事情我也常做。重點在學習,不是拿到學分;再來就是找一些網路上的免費教學,太多了請自己google;最差的就是去民間的資訊類補習班,昂貴又不一定打底打的好。

一些大學書單推薦:

資料結構理論與實務: 以C語言實作 (第三版)
資料結構理論與實務: 以C語言實作 (第三版)

資料結構-使用 C 語言
資料結構-使用 C 語言

演算法導論(Introduction to Algorithms)
演算法導論(Introduction to Algorithms)

推薦讀作業系統。因為作業系統就是集眾多資料結構與演算法於一身的東西。
作業系統概論(恐龍本)
作業系統概論

上述的書都有中文版可以找的到。

再來就是物件導向

https://ithelp.ithome.com.tw/upload/images/20191002/20005722lwIetnh30s.jpg

物件導向是你一生都必須要學的觀念 - 阿爾伯特·愛因斯坦(教授的話很好用)

為何要如此推崇物件導向。物件導向不只是用在資訊領域或程式設計,還有你的人生道路上。

這世界就是由物件組成的。物件三大特性,封裝、繼承、多型

封裝代表你對你的人生收納整理的能力,你應該專注在將知識歸納,封裝成自己可以不斷重複使用,並同中求變的東西。

繼承不是找一個富爸爸,而是找到這世界彼此的關聯性,建立典範轉移的迅速過程,比如你若發現每一個程式語言其實都有一個共同的父類別繼承,你就會發現應該要先學會那個父類別裡面的東西,然後透過繼承快速轉移學習到另外一個語言。

多型是當你在這世界遊走久了後,你會發現一件事情可以有很多描述,一個相同功能在不同的物件裡,可能有不同的解釋與輸出,再透過物件與物件之間的類別關係,你就會找到與你不同成長背景的人,在產生多型描述時,有可能的相同點,藉此達成共識。

深入淺出物件導向分析與設計
之前團隊中的Y君與W君有一起研讀此書,不是專注在程式本身(此書用Java寫的),但一些觀念還不錯,可以參考。

像是SOLID(單一功能、開閉原則、里氏替換、介面隔離以及依賴反轉)的描述,都可以在你的生活上得到解釋與應用。


上一篇
[守] Hey, bro! 重點不在Javascript與Python
下一篇
[守] 前端不會設計? 你到底是工程師還是前端工程師?
系列文
30天全端手把手學徒計畫-前後端整合之旅33

尚未有邦友留言

立即登入留言