Leetcode 刷題 pattern - Fast & Slow Pointer

前言身在大 CS 時代,有越來越多人投入刷題的行列,在眼花撩亂的題海中,要想有效率地刷題,掌握並通達題目解法背後,可以不斷被拿來使用的觀念,才能做到以簡禦繁。之前 Huli 寫的 程式解題新手入門注意事項 也講得非常好,寫題目是為了學會解題的思考方法,確保自己掌握重要的資料結構跟演算法。這也是為什麼我想要寫這系列的文章,把多個散落在各處的題目銜接起來,以後看到相似的問題就可以舉一反三,而不是去背各題目的解法。 舉例來說,之前遇過一題電話

Read More...

程式解題新手入門注意事項

前言

在這兩三年之間,「刷題」似乎成為了一種風潮。本科系要去面試大公司的時候要刷題,非本科系出去面試也要刷題,好像只要沒有刷題就會落後他人,就會被公司刷掉。

其實我一直不是很喜歡「刷題」這個詞,主要是因為「刷」這個字。不知道大家對這個字的解讀是什麼,但我會認為有種「為了寫題目而寫題目」的感覺,就好像題海戰術那樣。雖然說題海戰術用得好的話成效滿顯著的,但總感覺很多人刷到最後會變成「看過的題目就會,沒看過的就一定不會」,如果是這樣子的話,那我覺得不是一件好事。

之前我有寫了一篇文章:當我們在學程式時,要學的到底是什麼?,稍微談了一下這件事情。

總之呢,比起刷題這個詞,我更喜歡用「程式解題」四個字來表達我想表達的意思。

Read More...

Leetcode 刷題 pattern - Next Greater Element

前言身在大 CS 時代,有越來越多人投入刷題的行列,在眼花撩亂的題海中,要想有效率地刷題,掌握並通達題目解法背後,可以不斷被拿來使用的觀念,才能做到以簡禦繁。 繼之前寫過的 Two Pointer 跟 Sliding Window,今天要來跟大家介紹另一種演算法的 pattern - Next Greater Element。 Next Greater Element 的第一個範例 - Leetcode #496 - Next Grea

Read More...

Leetcode 刷題 pattern - Sliding Window

前言身在大 CS 時代,有越來越多人投入刷題的行列,在眼花撩亂的題海中,要想有效率地刷題,掌握並通達題目解法背後,可以不斷被拿來使用的觀念,才能做到以簡禦繁。 繼上次的 Two Pointer,今天要來跟大家介紹另一種演算法的 pattern - Sliding Window。 Sliding Window 的第一個範例 - Leetcode #209 - Minimum Size Subarray Sum題目我們先看一下題目的敘述:

Read More...

Leetcode 刷題 pattern - Two Pointer

前言身在大 CS 時代,有越來越多人投入刷題的行列,在眼花撩亂的題海中,要想有效率地刷題,掌握並通達題目解法背後,可以不斷被拿來使用的觀念,才能做到以簡禦繁。 今天就要跟大家介紹一種演算法的 pattern - Two Pointer。 Two Pointer 的第一個範例 - Leetcode #167 Two Sum II題目我們先看一下題目的敘述: 輸入是一個 array,裡面是已經排好序的 int,剩下就是要找到加總起來等於

Read More...

記一次 Leetcode 刷題體悟 - Valid Number

前言身在大 CS 時代,可能很多人有刷題的經驗,也可能像筆者一樣正經歷刷 Hard 題的各種撞牆。但在這種撞牆的時刻,我們反而可以來觀察自己的思考方式是不是有問題,才會導致撞牆。 今天,就讓我們一起來看一題令許多人抓狂的 valid number。 題目介紹 - Valid Number題目敘述如下: 基本上就是要判斷一個字串是不是可以被當作一個數字。如果你試著去解解看這題,你可能會發現一件事,就是你很容易不斷漏考慮一些 case。但

Read More...

用 JavaScript 學習資料結構和演算法:字典(Dictionary)和雜湊表(Hash Table)篇

前言在之前我們學習了一種不重複元素的集合,本文我們繼續討論另外一種不重複值的資料結構:字典(Dictionary)和雜湊表(Hash Table)。在集合中我們主要關心的是值本身 { 值(value): 值(value)},在字典(Dictionary)和雜湊表(Hash Table)則是有 { 鍵(key): 值(value)} 之間的 mapping 關係。 什麼是字典(Dictionary

Read More...

用 JavaScript 學習資料結構和演算法:集合(Set)篇

什麼是集合(Set)?集合是一個源自於數學理論中擁有不同元素的集合: N = {0, 1, 2, 3, 4, 5, 6, …} 空集合:{} 其特性在於它是由一組無序且不重複的項目組成。你也可以想成是一個沒有重複元素和無順序的陣列。在這篇文章我們會介紹如何實作集合資料結構並使用 交集、聯集、差集等集合操作方式。 集合初體驗事實上,在 ES6 中就有原生的 Set,在這邊我們試著使用 JavaScript 物件模仿 ES6 的

Read More...

用 JavaScript 學習資料結構和演算法:佇列(Queue)篇

什麼是佇列(Queue)?佇列(Queue)是一種先進先出(First In First Out, FIFO)的有序串列(Ordered List),與堆疊(Stack)後進先出(Last In First Out, LIFO)不同的是佇列(Queue)的新增和刪除元素是發生在不同端,新增元素在尾部、移除元素在頂部,最新加入的元素會從尾部排入。在一般生活中比較常見的例子是電影院排隊買票、小七便利商店排隊付款(當然不能有人想插隊啦),在

Read More...

用 JavaScript 學習資料結構和演算法:陣列(Array)篇

什麼是陣列(Array)?陣列可以說是程式語言中暫時儲存資料的櫃子,幾乎所有的程式語言都具備陣列這個廣泛運用的資料結構,但值得注意的是一般程式語言中陣列只能儲存同樣型別的值,但在 JavaScript 則可以儲存不同型別的值(但我們還是盡量避免)。 下面是陣列的簡單使用情境,當今天我們想儲存整個班級的學生姓名時,我們不可能使用一個個變數去一個個儲存,這時候陣列的功能就派上用場了: 1234567const student1 = &#x

Read More...