【軟體工程師一定會遇到的面試關卡 】#文末分享LeetCode折扣
由於美國多數科技公司在面試階段時必考「資料結構及演算法」(Data Structures & Algorithms),因此相關「題庫」也在大家口耳相傳下越積越多。許多工程師在計畫求職或轉職前,也都會花上好一陣子時間「刷題」,以求得更好的成績。
但「刷得多」、「刷得快」就真的能增加成功機率嗎?
一起來看看作者根據自身及身邊朋友的經驗,整理出「有效率」的準備方式→
▍《直擊 2020 選後美國》入手季刊 >> bit.ly/3oquNWv
▍一年四本季刊雜誌這裡訂 >> bit.ly/31Hs7uA
「leetcode題庫」的推薦目錄:
- 關於leetcode題庫 在 換日線 Crossing Facebook 的最佳貼文
- 關於leetcode題庫 在 旅行熱炒店Podcast Facebook 的最佳貼文
- 關於leetcode題庫 在 換日線 Crossing Facebook 的最佳貼文
- 關於leetcode題庫 在 [心得] Leetcode 刷題解答與Python 3 小技巧分享- 看板Soft_Job 的評價
- 關於leetcode題庫 在 leetcode的推薦與評價,FACEBOOK、DCARD和網紅們這樣回答 的評價
- 關於leetcode題庫 在 leetcode的推薦與評價,FACEBOOK、DCARD和網紅們這樣回答 的評價
- 關於leetcode題庫 在 完刷LeetCode DP 公開題目- 演算法海牛 - Facebook 的評價
- 關於leetcode題庫 在 新手如何刷LeetCode | 刷题找工作 的評價
- 關於leetcode題庫 在 [心得] 我的leetcode刷題清單- soft_job | PTT職涯區 的評價
- 關於leetcode題庫 在 [心得] 我的leetcode刷題清單- 看板Soft_Job | PTT職涯區 的評價
leetcode題庫 在 旅行熱炒店Podcast Facebook 的最佳貼文
《誤打誤撞的意外旅程:我如何成為一位碼農》
(三) 就這樣走到了今天,然後呢?(文極長,慎入)
.
前情提要: (1) https://bit.ly/2SHjah7 (2) https://bit.ly/2u6gHCB
.
如同前文所述,三年多的新創環境裡有許多的不順遂,對我而言就像是抗壓性測試。雖然說最後狀況開始漸漸好轉、和同事們也建立了革命情感,但我知道在專業上自己還是處於捉襟見肘的狀態——新創環境資源不多,我們的經驗也不太足夠,常常在時間壓力下土法煉鋼,手上的產品就因此做得越來越像一輛拼裝車——看起來能跑、但實際上有著隨時會散掉的危險。我很想解決這些問題,自己的能力和高層給予的空間卻又不允許。
.
探索許久,最後我得出了「轉職」這個結論,目的是希望自己在更健康的環境下,學到更多業界的「最佳作法」(best practice),這樣如果未來再回到這種環境,我才有能力去解決這些問題。那時是2017年的年尾。
.
* * *
.
經過了5年多的磨練,那時候的我已經算是一位相當典型的「碼農」,找的自然也就是業界大公司的軟體工程師職位,目標相當清楚;那麼,我又該怎麼準備面試呢?
.
在近幾年的北美大型公司,軟體工程師的面試有標準化的趨勢,重點都放在寫程式,而且以類似的考題為導向,這造成了一個很有趣的生態——面試這些職位變得像是在考聯考一樣,大部分的工程師如果要轉職、而且以知名公司為目標,第一步就是先去找演算法題庫刷上幾百題;其中最知名的網站叫做LeetCode,只要你願意多付一點錢,他們還可以告訴你哪些題目是谷歌、臉書、微軟與亞馬遜這四大巨頭會考的。
.
憑良心講,我個人並不享受這個過程。這些考題無論難易,基本上考的是你解題的能力,而不是我認為在業界更重要的——把各種已有的解法綜合在一起、然後和團隊合作找到最能達到目標的做法。我身邊認識的多數工程師也同樣不太享受這個過程,只是因為那些大公司的福利實在太好,而甘願拼了老命去練這些考題。(不覺得很像台灣的高三學生嗎?總會聽到老師說「這一年好好忍耐用功,等考上了理想校系就由你玩四年」這類鬼話。)
.
* * *
.
要面試哪家公司則是另一門學問。那時候因為已經進入F家和G家的面試程序,心裡也做好了搬到矽谷的心理準備,甚至開始研究加州灣區的生活機能,並且朝聖一下那高得嚇死人的房價。但不知道為什麼,內心深處還是有個聲音說:波士頓也不差呀!也找幾個這邊的工作機會吧!
.
然後我就很敷衍地做了一件事:直接找網路上評價最好的軟體公司排名,看看有沒有哪家在波士頓的。這時候我注意到有家以前沒聽過的公司叫做HubSpot,總部就在離我不遠的Cambridge,做的東西我也不是特別感興趣,但是很奇怪的就是覺得好像可以申請看看,於是隨便在他們網站上看了看就把履歷丟了出去,連職稱都沒看清楚(笑)。
.
結果有點令我意外——履歷一丟馬上就跟HR連絡上、很快獲得現場面試的機會,面試後很快就拿到了口頭offer,從頭到尾只用了不到三個星期。因為發展實在太迅速,最後只好硬著頭皮跟HR說,我三個禮拜後還要去G家面試,可以等到那邊結果出來再發給我正式offer嗎?
.
HR倒是答應得很爽快。從言談中得知,其實他們還蠻常碰到這種需要搶人的狀況的,早就處理得駕輕就熟啦。
.
* * *
.
2018年三月底,我抱著送死的決心飛到山景城的G家總部面試,最後也不意外的鍛羽而歸。有趣的是,這件事情那時候並沒有讓我很挫折,只因為比起灣區,我內心還是對波士頓有稍微多一點的好感。
.
於是我回到了波士頓,開開心心地接受了HubSpot的offer、告別了充滿愛恨情愁卻仍然有點不捨的那家新創。接下來做的第一件事情當然不是馬上開始新工作,而是先放自己兩個月的假,用了其中42天去壯遊。相關文章可參考《2018大旅行》系列文( https://ltsoj.com/tag/Grand%20Trip )。
.
就這樣開心放蕩了兩個月。2018年7月初,我才開始在新公司的工作。
.
* * *
.
HubSpot的產品核心是客戶關係管理系統(customer relation management,簡稱CRM),從10幾年前的新創,一路成長到當時有超過500人的研發部門。在這樣規模的公司裡,我的加入就像是成為一顆小螺絲釘,在這部偌大的機器裡管好自己的小角落。
.
身為一個已經有6年經驗的工程師,又經歷過大公司與小公司的磨練,上手新工作應該是輕而易舉吧?沒想到結果卻出乎我的意料。
.
HubSpot是一家給予工程師極大權限的公司,任何一位工程師都可以不經過任何人同意,直接改動產品的程式碼並且放到線上給客戶用;換句話說,每個人都像金正恩一樣,隨時可以按下核彈發射的按鈕(誤)。這意味著每個工程師都被賦予了很大的決策權,同時當然也得承擔相應的責任。至於這些決策(從程式怎麼寫、要做到什麼程度、寫好後如何發佈,到發佈之後如何和用戶溝通)怎麼做才對?這就取決於你對這家公司內部系統(無論是技術上或組織文化上)有多了解。這是為什麼幾乎每個同事剛加入時,都得經歷過一段不短而且充滿挫折的適應期。
.
以我自己來說,雖然我個人非常喜歡擔任決策者的角色,但過去三年半在前公司那種「上面說什麼就做什麼」的運作模式,已經深深影響了我當時的工作風格;因此,如何重新把自己調回一個更獨立的角色,並且找到新環境中的生存之道,是我加入HubSpot之後持續面對的挑戰,甚至直到已經入職一年半的今天都還是如此。
.
故事講到這裡,我們已經來到了「現在進行式」。這個仍然在發展中的故事,接下來的情節會是什麼?
.
* * *
.
「軟體工程師這個職業,我到底還會做多久?」我常常這樣問自己。
.
如果用旅行來做比方,我現在就像是在走在一條計劃以外的路徑上。這條路上風景其實還不錯,走起來也算平坦舒服,路旁設施完備,幾乎要什麼有什麼,前面更有著很大的空間等著我去探索。要我一直這樣走下去,發掘路上更多計畫之外的美好,我想應該是不會有太大問題。
.
然而,我也仍然記得自己最早的熱情所在:想要了解並且接近這世界各地的人事物,並且將自己所見到的和人分享。這個目標某種程度上來說很像是童話故事中的遙遠國度,你不見得講得出它的具體位置,甚至不確定它究竟是一種怎樣的存在,但你知道就是它促使你踏上了這段旅程。
.
我認為這兩條路並非完全沒有交集,最理想的情況或許會是:我一邊沿著前者邁進的同時,一邊發現它也正在帶領我一步步向後者接近;但也有可能我最終必須在某個時間點停下腳步,抱著破釜沈舟的決心改變方向。總之接下來究竟會如何發展,我自己也不知道。
.
* * *
.
話說回來,雖然辦公室裡的碼農生活常常讓我覺得離世界越來越遠,最近我卻有了不同的想法:軟體工程師現在可是許多國家都有需求、而且少數不太受文化差異限制的職業(畢竟大家寫程式還有溝通用的大多還是英文啊)。也許我現在擁有的這份職業,未來會是將我帶向遠方的那雙「隱形的翅膀」呢(不好意思快選舉了,腦中一直浮現政治梗,哈哈)!
.
(全文完)
.
(圖為我貼滿地圖的辦公室座位,說明了我雖身在公司裡,心卻常常在遠方的某個世界角落,哈哈。)
leetcode題庫 在 換日線 Crossing Facebook 的最佳貼文
【練 code 就像是在爬天梯】#矽谷龍頭要的是即戰力而不是碼農
Facebook, Amazon, Netflix, Google 是矽谷四大科技龍頭企業,想成為底下的員工難如登天,光是面試階段就得通過層層的技術測驗。求職的工程師們無不瘋狂練習著 LeetCode 網站上的考古題庫,不刷不行!
「如果各位想進來精英中心工作,就要先經過選拔,因為我們只會訓練精英,絕對不會接受__。」 (咦?
●更多矽谷的在地觀察請看 → http://bit.ly/2zX5btV
#矽谷 #工程師 #求職 #面試 #LucyChang #矽谷資深女工程師
▍換日線 2018 秋季號《異鄉人的「天堂路」》→ http://bit.ly/2POJTVk
leetcode題庫 在 [心得] Leetcode 刷題解答與Python 3 小技巧分享- 看板Soft_Job 的美食出口停車場
嗨,大家週末愉快!
不知道還記不記得之前小弟有分享面試 Google TW SWE 的心得,
最後有提到小弟當初有發願,如果順利進去要把過去寫過題目留存的解答整理分享出來,
最近終於施工完了,提供給有需要的人可以自由取用。
這份解答內涵蓋了 781 題的 Python 3 解法(太早期刷的題目就沒留解法了 QQ),
寫這些解答的目的是為了還願並且回饋給還在努力的板友,
唯一的使用限制就是請不要拿來作商業用途,讓知識無償分享出去,感謝大家。
https://www.notion.so/lenchen/LeetCode-47d625b874894484af7c055b024b9817
內容主要分成四大類,
1. 資料結構
主題涵蓋常用於 Leetcode 內解題的資料結構,
較常見的:Array/String, Matrix, Linked List, HashSet/Map, Stack, Queue, Heap
較高階的:DSU, Trie, BIT
還有偶爾會用到 Deque 跟 sortedcontainers,但數量比較少就沒特別分類。
2. 演算法
這邊其實是我自己的歸類,不一定只有這些 XD
內容涵蓋有:
greedy, multiple pointers, sliding window, sort, DFS/BFS, backtracking,
sweep line, rolling sum, binary search, dynamic programming, minimax
有趣的是這邊沒列 divide and conquer 這個經典分類,
因為好像幾乎沒遇到過哪題是只能使用 divide and conquer 解的,
所以就沒有讓它自成一個分類了。
但若有題目也可以用 divide and conquer 解的話,
我也有寫下來,所以還是可以再自行了解下。
3. 圖
圖相關的問題因為太經典所以自成一個主題,
整理了我所遇到的常見圖論演算法,還有 topological sort 的兩種方式,
最重要的是 tree 相關的分類也包含在這一部分內。
4. 其他
數學、隨機、位元操作相關的題目都會在這裡。
大致上就分這四個部分,每個解答底下都有一行字總結這題的解題概念,
因為跨越了兩年半所以 coding style 可能也有些不一樣,
但保證其中 99% 的內容都是我親手一個個字元打出來的,
希望能幫助到有需要的人 :)
另外順便再分享一些我覺得使用 Python 3 刷題時可以用的一些小技巧,
可以讓你的 code 變得更精簡,大家可以看看然後挑自己喜歡的來使用:
1. 用 next 搭配 generator comprehension 來獲取第一個滿足條件的元素,
像是 next(ele for ele in arr if ele > 0),就可以拿到 arr 中的第一個正數。
2. 解對稱性題目時,可以把引數調換 call 一次,減少重複的 code,像是:
def foo(a, b):
if a > b: return foo(b, a)
...
就可以讓你接下來維持在 a <= b 的前提下繼續寫 code,或者直接 swap 引數也可以:
def foo(a, b):
if a > b: a, b = b, a
...
3. python dict 可以使用 tuple 作 multikey,像是 d[k1, k2, k3],
如此一來就不用巢狀 dict 了(d[k1][k2][k3])
4. 可以使用 unpacking 來抽取出需要的參數,像是:
A = [1, 2, 3, 4, 5]
foo, *B, bar = A
可以得到 foo == 1, B == [2, 3, 4], bar == 5
另外還可以用巢狀 unpacking,
像是 for i, (a, b) in enumerate(pairs): 就超級常用。
5. Python 3.8 跟 3.9 有多了一些不錯的東西,
像是 3.8 的 assignment expression(:=) 跟 3.9 的 dict shallow merge(|)
都有機會可以讓 code 更精簡。
6. 有些 matrix 或是 grid 的題目,兩個 dimension 長度有可能為 0,
可以用 if not any(matrix): return xxx 來處理(感謝 Stefan Pochmann)
7. in 也會消費 iterator,
所以如果想知道某個 str s2 是不是另一個 str s1 的 subsequence 可以這麼做,
I = iter(s1)
return all(c in I for c in s2)
(再次感謝 Stefan Pochmann)
8. 想要測兩個數是不是同正負可以用 (a > 0) is (b > 0),記得事先檢查 0
板友提供 (credit to @pig2014): a ^ b > 0 更好
9. 想要攤平巢狀 list 可以用 sum(L, []) <- 不建議!途中 list 會一直重新 alloc
(credit to @coquelicot)
參考 stack overflow:https://bit.ly/3rz8UqH
建議的替代:
9.1. list comprehension: A = [ele for sub in arr for ele in sub]
9.2. itertools: A = list(itertools.chain.from_iterable(arr))
9.3. reduce: A = functools.reduce(operator.iconcat, arr, [])
10. 某些要提供 factory function 的地方,可以遞迴給自己,像是:
trie = lambda: collections.defaultdict(trie)
11. itemgetter 在某些需要 key 的 builtin function 很好用,像是:
sorted(A, key=itemgetter(1)),等同於寫 key=lambda x: x[1]
12. 因為 Python list 提供 negative indexing,
在某些情況可以用 ~i 來獲得對應於 i 的反向 indexing,像是:
for i in range(len(A)):
A[i] += xxx # A[0], A[1], A[2] , ...
A[~i] += ooo # A[-1], A[-2], A[-3], ...
大概就是這些東西了吧,這些技巧有些人喜歡有些人不喜歡,
我覺得沒有對錯啦,就挑自己覺得不錯的用吧 XD
happy coding!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.161.76.160 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1627032495.A.65E.html
同意,所以我文中有說有些人喜歡有些人不喜歡,選自己喜歡的用就好,
像是我個人比較偏好用 dict.setdefault 建 trie 而不是用 defauldict,
但這些技巧的背後都代表著一些語言特性,了解一下並不吃虧。
而且說句實在話,限制短時間的面試 跟 長期維護的產品,出發點並不能一概而論。
沒錯,絕對不要背答案,一個變化就倒了,該學習的是每題背後用到的觀念。
然後這份的解法就是揉合了討論區跟解答寫出來的 XD
因為發現有時候 leetcode 解答反而不是最佳解,
像是 Morris traversal 就只有少數幾篇解答有提到,但超多題目其實都可以用。
沒有耶,在學期間是有修過幾門 AI/ML 相關的課程,
出社會後主要是在做 web/app 的開發。
... <看更多>