這個系列是根據Amazon面試準備內容,軟件開發工程師面試準備 (Software Development Engineer Interview Preparation, SIP) 進行整理,該部分說明了探討了一個編碼範例,以及軟體工程師在面試或遇見新問題時應如何處理、分析和解決此類問題。
概述
萬事起頭難,設計系統也是一樣的,因此這邊我整理了,當我們要開始設計一個方法應該要怎麼起頭。這邊我們除了講述概念也會使用範例去說明。
架設我們這次的題目是 – 『Run Length Encoding』
流程
詢問更多細節
- 將模糊的問題定義清楚
Q1. Run Length Encoding 是什麼?
A1. 將一串英文字進行簡化,例如 aaaabbccc會轉換成4a2b3c
Q2. 如果是 aaaabbcccaa 會轉換成『4a2b3c2a』還是 『6a2b3c』?
A2. 會轉換成『4a2b3c2a』
- 詢問極端狀況的處理方式
Q1. 如果輸入為空值時,回傳什麼?
A1. 空值
Q2. 英文字前面的數量有限制嗎?
A2. 沒有,aaaaaaaaaa 會轉換成『10a』
實作
- 輸入與輸出(Input/Output)
Q1. 輸入是什麼型別?
A1. 文字
Q2. 輸出是什麼型別?
A2. 文字或是空值
----
# simplify letter string
def run(string: str) -> str:
- 註解優先(Comment First)
在方法和每個段落說明要寫的內容,有助於未來理解和測試。
# simplify letter string
def run(string: str) -> str:
current_letter_count = 0
current_letter = string[0]
return_label = ""
# loop for letter
for letter in string:
# if letter is different, updated return label and init var
if letter != current_letter:
return_label += f"{current_letter_count}{current_letter}"
current_letter_count = 1
current_letter = letter
else:
current_letter_count+=1
# Updated final letter
return_label += f"{current_letter_count}{current_letter}"
return return_label
print(run("aaaabbccc"))
測試
這邊我們可以進行一些腦內測試,這邊是我們常見的一些要完成的測試。
- 正常值的執行狀況
aaaabbbcc
aaaabbbcca
- 空值
# 上面的範例是沒有顧及到這個情況的,因此會產生
Traceback (most recent call last):
File "<string>", line 24, in <module>
File "<string>", line 6, in run
IndexError: string index out of range
這個錯誤。
- 時間複雜度
盡可能保持 O(n) 或是 O(1)