什麼是LeetCode?

LeetCode是一個收集軟體工程師面試考古題的線上練功網站。

從幾年前的100多題,到現在已經累積超過700題;在上面可以選擇自己習慣的語言解題,除了鍛鍊思考外、也暫時離開編輯器的援助。

求職者為了在時間有限的面試下表現得更好,會在網站刷題練手感。


為什麼要刷題

如果你想在矽谷找到優秀的軟體工程師,那你就得面對這個現實:99%的招募過程,幾乎不可避免會與Leetcode考古題網站打交道。

軟體工程師因為是技術崗位,在招聘的過程會測驗應徵者的技術能力,從網路上前輩們的分享得知,會先透過電話面試、後續才會被邀請到公司進入下輪。

而電話面試會請受試者打開某個協同文件,在沒有編輯器幫助的情況下解題。差別在如果語法錯誤、或是左右括弧未成對等編輯器會跳出提示幫助,所以對於語法必須相當熟練。

後續的白板解題更是直接離開鍵盤。

由於近幾年 CS 太火熱了,軟體工程師的競爭者越來越多,導致題目一年比一年多,一年比一年難,在時間內解出題目已經不夠,還必須要寫出最佳解,我準備的方法不免俗的還是刷 LeetCode。

衝擊性的認知

我看的線上課程算多,不過當我最近認識LeetCode才發現到,兩個方向基本不太一樣,遭遇了毀滅性的認知打擊。

一般課程都是教你怎麼樣快速做出有成就感的東西,主要在「應用」層面,比如說做出幾款應用等等、表格地圖資料庫範圍。

而面試題偏向資料結構和演算法,這些東西就屬於學科裡的硬底子功夫,像是Binary Tree和Linked List,可能會覺得很陌生或根本沒被提到。

除非特別做功課,不然以作品為導向的課程沒有太大幫助。

一來不懂這些依然可以做出應用,二來這並不是大部分消費者會想(需要)學習的範圍,非本科的要靠自己找書補足這方面的知識點。

被題目各種

例如「不使用加減號,完成兩個數字求和」、「給出羅馬數字回推阿拉伯數字,好比”VI”會得到6、”DCXXI”得到621」。

種種看到懷疑人生的驚喜,連答案擺在前面都不知道他寫啥咪。

「a + b = (a ^ b) + (a & b << 1)」

…(;´༎ຶД༎ຶ`)??

如果你一不是科班出身二沒有經過大量算法練習,比如我,leetcode題不會做絕對不是丟人的事而是再正常不過了。這就和做高數題一樣你沒練過接近的題型很多時候想破腦袋也未必能做出來。

對於能全部刷完的實在深感佩服,還看到不少刷了好幾輪為了求好offer實在是讚嘆,也覺得背脊一涼。

連這種遙不可及的成就找工作都略顯吃力,也就代表整體的素質門檻被越墊越高,光想就覺得很抖。因為CS熱門程度近幾年的觀察就業也嚴峻不少。


慢慢累積

回過頭來,對我來說不要說「刷題」了;基本就是大眼瞪小眼,看可否用灼熱的視線燒穿題目的深意,但基本上都是被甩巴掌的份就是。

舉上面這題來說,給一個陣列,裡面數字都是兩兩存在、但有一個落單的數字,請抓出來。假設給[1, 1 ,2],那2就是落單的數字。

所以我前面有提到,這跟講求「應用」的課程不同,更多的是硬底子思考,遇到當場就卡住了。

像移動火柴棒讓兩邊的等式成立那種遊戲,需要一個「啊哈」摩門特,有看出來就有、沒有就是沒有。

現在能解出來也不代表再有壓力的情境下可以順利完成。

嗯…第10行的^是什麼?

因為這題才去研究XOR,平常都只用and和or而已。


再來一題。

題目給羅馬數字,要把它轉換成阿拉伯數字。比如給”IV”得到數字4、給”VI”會得到6,”DCXXI”得到621。


再來一題。

在不使用+、-號的方式下,取得兩個數字的加總。

..

(°ཀ°)