MF99 coding 💻

keep learning; keep coding;

Code interview:Coding 面試與思考訓練 - 實戰演練 part 1

在前一篇 Code interview:Coding 面試與思考訓練 - 💻 MF99 coding 之中,有提到了 coding interview 解決問題的7個步驟。 這裡就來實際用一個例子,來模擬一個真實的面試情境。

由於一篇可能也寫不下,所以可能會把整個解題過程拆分,並且從中穿插一些之前面試的一些心得與小技巧。

首先是題目﹔

題目:

給定一組人的列表,列表當中有記錄著他們每個人的出生以及死亡年份

問題﹔請找出人口數量最多的年份

所以我們就跟著以下這7個步驟來一步步思考並解決這個問題

  1. 確認問題(Listen)
  2. 列舉 (Example)
  3. 暴力破解 (Brute Force)
  4. 優化 (Optimize)
  5. 再次檢視 (Walk Through)
  6. 實作 (Implement)
  7. 測試/驗證 (Test)

1. 確認問題(Listen)

首先聽到這個問題時,很多工作多年的工程師很直覺的就會開始思考;找規律、想邏輯,甚至就開始動手想寫 code。

但是其實第一步應該是先好好思考一下是否聽懂了問題本身,並且確認手中已經有了解題所需的所有線索與資訊。

比較通常這類面試,其實不會有像是筆試一樣的紙本題目,有可能唯一能聽清楚問題全貌的時候就只有現在,而且像我之前說的,面試官其實也會從旁觀察應試者是否有確認完題目才開始作答,甚至會刻意隱藏某些關鍵線索,等你來問。

以這個題目來說,可能相對的缺失的線索較少,但是稍微觀察一下有可能就會想到,由於題目的特性,求出來的結果可能不會是一個固定的年份,可能: 1. 有連續好幾年的人口數都一樣(都沒有人去世) 2. 不連續的兩年人口數剛好一樣。

所以,確認答案的輸出格式也是很重要,可以跟考官確認說,輸出的結果要如何呈現? 用年份的陣列? 還是有連續年份的話只要列出第一年?

確認手中都有了足夠的資訊,再開始花時間解題是很重要的,很多時候也可以避免到了後期才發覺整個方向走錯的窘境...

2. 列舉 (Example)

瞭解了問題跟掌握了線索後,下一步也不是急著動手寫 Code,而是試圖列舉出符合題目條件的實例。

透過列舉的過程,不只可以產生(至少)一組未來可以用來測試用的測試數據,二來有時候也可以透過列舉的過程發掘出這些數據的關係以及跟題目的關聯

以目前這個例子來說,可以很快的隨便列舉出幾個人,以及他們的出生/死亡年份

(方便起見,我就把年份控制在 1900~2000 之間)

人名 出生 死亡
A 1920 1980
B 1935 1998
C 1933 1954
D 1911 1999
E 1904 1988

初步看起來好像還可以~ 於是方便觀察,拉一個時間軸來標記所有人生處的年份

f:id:mouseface99:20191201222641p:plain

列完之後,首先是要來 debug 這組數據,是否具有代表性?是否為 Special case ? 還是是否包含了 special case?

看完之後我們發現了幾個問題:

  1. 這組數據裡面所有人都有共同生存的年代
  2. 大家壽命都好長(除了C)
  3. 大家重疊的時段都好接近

所以我們就來新增跟調整一些數據,來彌補剛剛提到的這些漏洞

f:id:mouseface99:20191202124142p:plain

並且對應著調整一下具體的數據

人名 出生 死亡
A 1920 1980
B 1974 1998
C 1933 1954
D 1923 1999
E 1902 1958
F 1901 1928
G 1963 2009
H 1938 1979
J 1949 1991
K 1913 1959
L 1975 2010

從上面的時間軸上面,也或多或少看得出來一些特性了,我們要解決的就是找出這些線段重疊最多的年份! 現在我們有了具體的數據,也有一些想法跟方向了,接下來就可以準備進行初步的暴力破解法!

Code interview:Coding 面試與思考訓練 - 實戰演練 part 2 - 💻 MF99 coding