筆試編程框架總結(jié)!
前面的話
經(jīng)歷面試前,我一直埋頭刷題,到了面試才發(fā)現(xiàn),沒有一套應(yīng)對真實環(huán)境的編程框架,有孫悟空的本事也使不出來,憋得難受。
痛定思痛,覺得要是早點有人告訴我就好了,整理下來,大家就不用再經(jīng)歷我當時的憋屈。
為什么要面試專用編程框架
在上篇刷LeetCode的六大誤區(qū)中有提到,筆試做題用的是純白板編程,要自己寫輸入輸出。這個是和平時LeetCode上的刷題有很大區(qū)別,??蜕嫌姓鎸嵉木幊棠J浇蠥CM,可以用來練習。
這個編程環(huán)境長啥樣?我在??蜕辖亓藗€圖:

筆試時,就是面對這個東西編程?,F(xiàn)在看著還沒啥,到了面試黑窗上再放個計時器,我滴媽,立馬腎上腺素飆升。下面整理我對于這個窗口悟到的編程框架。
純白板模式下的編程框架
首先,拿到黑窗口后,二話不說,直接把下面這段代碼寫上, 強調(diào):盡量用IDE!,這樣不同的大題,復(fù)制粘貼就完事,真正幫你節(jié)約大把時間來思考題目。
import sys
# 這里寫解決問題的代碼,和LeetCode就完全一樣了
def solve(arr):
pass
if __name__ == '__main__':
# 接收輸入的邏輯,這里先把輸入接收過來, 兩種選擇input()和sys.stdin.readline()
group_nums = input() #字符串形式,得轉(zhuǎn)成int
group_nums = int(group_nums)
# 對于每一組
for i in range(group_nums):
# 接收每一組的輸入, 這里不同的題目就不一樣了,但一定記住我們接收的還是一行,這是一個字符串
arr = sys.stdin.readline().strip().split(' ')
# 元素轉(zhuǎn)成int
arr = list(map(int, arr))
# 輸入接收過來之后,這里最好打印下看看接收的是不是正確,這個很重要
# print(arr)
# 處理具體的問題了
res = solve(arr)
# 輸出結(jié)果
print(res)
上面這個模板,處理的是多組輸入,或者多行輸入;如果是一組輸入,僅僅幾行的話, 就不用外層for循環(huán)的, 一行行的接收即可。
框架模板的優(yōu)勢
這個框架做到了主函數(shù)與處理問題的邏輯分離開。接收輸入 -> 處理函數(shù) -> 調(diào)整輸出即可。 這么一來,我們在solve里就可以像在LeetCode上一樣,直接寫解決問題的函數(shù)。這樣的代碼看起來清晰,找bug時也好找。
另外,就是一定要重視低耦合高內(nèi)聚的編程技巧。如果遇到處理不同的事情,盡量的寫成函數(shù)的方式,這樣調(diào)試起來會更加簡潔。
框架模板的注意點
邏輯通了,下面是細節(jié)上要注意的。首先是,接收輸入時都是一行一行地接收,這個是字符串形式,要先接收過來,再轉(zhuǎn)換格式。我個人習慣是先都接收了,然后統(tǒng)一轉(zhuǎn)換格式,比較清晰。只要保證接收正確,大家也可以在接收時直接轉(zhuǎn)。
這里主要整理接收intput()和sys.stdin.readline()兩種方式的區(qū)別。這兩個都是字符串格式,讀入一行,區(qū)別是后者會帶著一個換行符\n。啥意思?我們在輸入時,是把輸入輸完之后,敲一個回車告訴編譯器我敲完了。這倆的區(qū)別就是input()會過濾掉最后的回車,而sys.stdin.readline()會帶著后面的回車。
一個最簡單的例子:
arr = sys.stdin.readline().split(' ')
print(arr) # ['1', '2', '3', '4', '5\n']
arr = input().split(' ')
#arr = sys.stdin.readline().split(' ')
print(arr) # ['1', '2', '3', '4', '5']
可以發(fā)現(xiàn),如果用上面那個代碼,接收的輸入可能是不正確的。比如,有時用下面這個代碼把每個元素轉(zhuǎn)成int時,會出現(xiàn)一些不知名的錯誤:
list(map(int ,arr))
比如這樣的錯誤:
哈哈, 這里是我輸入時最后不小心多敲了個空格, 按照空格切分,把換行符單獨切成了一個元素,int轉(zhuǎn)換保留了這個錯誤。所以,如果想用sys接收輸入的話,更加魯棒性的代碼是:
arr = sys.stdin.readline().strip().split(' ')
也就是加一個strip函數(shù)去掉多余的空格或者換行符。還有一種魯棒性的寫法:
arr = input().strip().split(' ')
這兩個寫法都可以, 建議用input。
同樣的輸出也有兩種方式:
# sys.stdout.write(''.join(arr))
# print(''.join(arr))
這倆的區(qū)別是sys的那種,最后不會加一個換行,而print我們知道,輸出完畢之后,會自動加一個換行符。建議還是print吧,花里胡哨的多了,就容易出錯。
好了, 有了這樣的一個框架,就把ACM模式轉(zhuǎn)成了我們常用的LeetCode模式了。最后再次強調(diào)IDE的重要性:自動補全,調(diào)試,保存代碼都非常方便。
總結(jié)
確實,有些坑,得需要自己去趟、去試, 可千萬不能小馬過河。接下來這段時間,我們一起再抓住最后一點機會,去試錯。過于謹慎和完美主義,往往會錯失良機。
秋招在即,六月一定得趕早準備。現(xiàn)在大部分公司感覺都滿員了,壓力和競爭越來越大,又到了暴風雨前的寧靜,接下來,繼續(xù)加油, Rush!
