iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 5
14
Software Development

前端工程師用 javaScript 學演算法系列 第 5

[番外篇] 解 LeetCode 之前

https://ithelp.ithome.com.tw/upload/images/20190906/20106426HUyvkYbAGz.jpg

在正式解題之前,當然要先來簡單介紹一下 LeetCode。LeetCode 是一個收集軟體工程師面試題目的網站。也就是說假如你全部刷完,那在 google、facebook 這種公司上班也不是難事了! 等等,不要高興的太早,個人覺得不可能刷完的 T__T。

尤於近幾年 CS 實在太火紅,軟體工程師競爭者越來越多,導致題目越來越多而且越來越難, LeetCode 題目已從前幾年 200 題到現在已經超過 1000 題。刷完根本神人等級了吧! 不過別氣餒,基本上刷 easy 在搭配 medium 並融會貫通後,找一般工作就不是甚麼太大問題了。

新手刷題會遇到的困難

https://ithelp.ithome.com.tw/upload/images/20190906/20106426NOfYtUY6TE.jpg

  • 台灣軟體業偏向快速完成作品,而且現在前端框架、Library、好用外掛實在太多,導致最基礎的純 JS 很不熟,但刷題沒有任何第三方工具可以使用,必須對語法本身相當熟練(例如 javaScript)。
  • 現在編輯器越來越厲害,很多快速鍵。但實際面試解題沒有編輯器幫助,如果語法錯誤、打錯字並不會有提示。
  • 英文... 一開始可能連看懂題目都有問題更不用提面試了 orz,建議平常除了多看英文相關技術文件外,我也推薦可以看 前 google 工程師 youtuber 練一下程式方面的英文聽力跟說法

假如你不是 CS 科系畢業,刷題花上一兩個小時還解不出來 (像我一樣),完全不用丟臉。一回生,二回熟。學起來就是你的了


怎麼開始

曾經試過隨機刷題,但一開始演算法並不熟,每每都弄得很挫折。後來決定先刷同一個類型,例如 Array 30 題刷完再刷 String 這樣。刷完 30 題其實這個類型題目跟概念也大致上有了解。
https://ithelp.ithome.com.tw/upload/images/20190906/201064268A2Bu8DELS.png
這邊有作者分類先易後難的順序,也可以做參考

如何刷題

https://ithelp.ithome.com.tw/upload/images/20190906/201064268A2nWaTSAg.jpg
真正面試時跟 LeetCode 真的很像,大致分四部分。我就把它拆出來列在下面。

1&2 題目跟範例

對於題目講不清楚的地方 "一定要問問題" (後面會說明要問甚麼)

// ------- 1. 題目 ------------
// 167. Two Sum II - Input array is sorted
// Given an array of integers that is already sorted in ascending order, 
// find two numbers such that they add up to a specific target number.

// The function twoSum should return indices of the two numbers such 
// that they add up to the target, where index1 must be less than index2.

// 請找已排序陣列(小到大)裡,哪兩個數字總和等於 target
// Note:

// Your returned answers (both index1 and index2) are not zero-based.
// You may assume that each input would have exactly one solution and 
// you may not use the same element twice.
// Example:

// ------- 2. 範例 ------------
// Input: numbers = [2,7,11,15], target = 9
// Output: [1,2]
// Explanation: The sum of 2 and 7 is 9. Therefore index1 = 1, index2 = 2.

3 input/output

傳進去 (input) 跟傳出來 (output) 的型別

/**
 * @param {number[]} numbers //[都是 number]
 * @param {number} target
 * @return {number[]}  // 值都是 number 的 Array
 */

解題涵式

var twoSum = function(numbers, target) {

};

看懂以上後就開始自己猛寫 Try and error了?! 先別急著開始,面試時著重於 "思考"、解決問題能力跟溝通。公司不會想應徵一個完全不溝通也不先跟團隊討論想法的人

Think

  • 想一些"極限值"。面試時也可以問考官這些狀況會不會發生
  • 稍微想一下這個題目會用甚麼方法,例如 two pointer 或 stack。Leetcode 上也有 realated topic 可以參考

https://ithelp.ithome.com.tw/upload/images/20190906/20106426AKwRsI73Ku.jpg

終於可以開始解題了

  • 我會先處裡極限值,以這個範例來說,當長度 < 2 時就不處理
  • 開始邊寫邊驗證各種列出來的範例
var twoSum = function(numbers, target) {
	// 想極限,例如只有一個值 [2] target = 2; [2] target = 9
	// 很多相同的值 [2, 2, 2] 
	// 如果有大於兩個結果 [1, 6, 2, 5] target = 7 // 但這部分題目有說明不會發生
	// 值是負的 [-1, 8] target 7 因為題目只有說是 integers

	let len = numbers.length
	// pointer 概念
	let pointer = 0
	let ind = len - 1;

	if(len < 2){
		return false;
	}
 // ... 後面省略
};

盡量不要一開始就看別人的答案,下面有兩種情境我會看別人答案

  • 思考超過一小時還解不出來
  • 解出來之後看看別人有沒有更好解法,然後加強自己解法

https://ithelp.ithome.com.tw/upload/images/20190906/20106426MRbRA8zLuD.jpg
你的答案至少要比 60% 人快會比較理想。若太低也沒關係。多看看別人的解答與討論很有幫助的。

https://ithelp.ithome.com.tw/upload/images/20190906/20106426PT78xgUxLL.jpg

結論

所以當面試時解出一道題目,會需要下列幾個步驟

  1. 確定問題再說什麼,想一些 edge case 問面試官會不會發生(溝通能力)
  2. 想一下該題會用哪種演算法 (展現你資料結構/演算法能力)
  3. 寫出 code
  4. 測試
  5. 不斷溝通,切記不要當一個安靜的面試者,你可以把面試官當成你平常的同事,把解題想法都先跟他討論

明天會來解 561. Array Partition I905. Sort Array By Parity 若有興趣可以先來試試看

如有錯誤或需要改進的地方,拜託跟我說。
我會以最快速度修改,感謝您

歡迎追蹤我的部落格,除了技術文也會分享一些在矽谷工作的甘苦。


上一篇
陣列 Array
下一篇
[LeetCode #905, #561] Array
系列文
前端工程師用 javaScript 學演算法32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
海綿寶寶
iT邦大神 1 級 ‧ 2019-09-06 11:39:21

沒見過幾個程式寫得好的美女
看過了幾篇之後
來替妳加加油,按三個
/images/emoticon/emoticon12.gif/images/emoticon/emoticon12.gif/images/emoticon/emoticon12.gif

hannahpun iT邦新手 4 級 ‧ 2019-09-06 12:06:29 檢舉

但我認識很多很厲害的女工程師耶

hannahpun iT邦新手 4 級 ‧ 2019-09-06 12:06:30 檢舉

但我認識很多很厲害的女工程師耶

我在比奇堡,跟妳本來就是不同的世界
/images/emoticon/emoticon10.gif

1
Tony.Ko
iT邦新手 5 級 ‧ 2019-09-06 11:46:12

沒想到在這裡會看到TechLead exGoogle exFacebook
XDDDDDD

hannahpun iT邦新手 4 級 ‧ 2019-09-06 12:06:53 檢舉

雖然常常講屁話但學英文還蠻好用的

他最近也太不幸惹,老婆跑掉,又被FB開除,但是他還能藉機工商XD

正名為 TechLead exGoogle exHusband exFacebook

0
Ellen Su
iT邦新手 5 級 ‧ 2019-09-06 16:57:25

好期待這系列啊啊啊啊
謝謝Hannah

hannahpun iT邦新手 4 級 ‧ 2019-09-07 05:11:12 檢舉

/images/emoticon/emoticon41.gif

2
rainbowrain
iT邦新手 2 級 ‧ 2020-02-20 14:34:09

我想補充一下,不要對跑出來的時間跟記憶體的數字太計較。

剛開始解的時候都很在意,然後會去看頂標的人的寫法跟邏輯,有時候會學到新觀念,但有時候怎麼看就是不覺得那樣寫會比較好。直到有一次我直接 copy 頂標的 code 來跑,怎麼跑都跑不出那個成績,甚至沒有比我寫的好,就覺得在那邊想半天的自己很蠢。

可以參考,不要執著。

hannahpun iT邦新手 4 級 ‧ 2020-02-23 15:12:41 檢舉

好中肯!!

我要留言

立即登入留言