PREP是我創(chuàng)建的一個(gè)助記符驹碍,用來幫助你記住解決白板編碼時(shí)需要涉及的步驟壁涎。它代表P:參數(shù),R:返回志秃,E:示例怔球,P:偽代碼。
這個(gè)助記符是新的浮还,但是其技術(shù)是經(jīng)過實(shí)戰(zhàn)檢驗(yàn)的竟坛。本質(zhì)是一個(gè)對初學(xué)者比較友好版本的測試驅(qū)動開發(fā),很適合編程挑戰(zhàn)者钧舌。
我們一起通過一個(gè)例子來學(xué)習(xí)PREP担汤。例子中我將使用JavaScript語言,但是這項(xiàng)技術(shù)適用于任何編程語言洼冻。
面試官要求你寫一個(gè)函數(shù)崭歧,輸入一個(gè)句子并返回其中最長的單詞。你怎么做撞牢?
“P”就是輸入?yún)?shù)
大部分問題都會涉及編寫函數(shù)率碾。在這一步中你需要確定你的函數(shù)需要輸入一些什么參數(shù)。并給它們?nèi)∫粋€(gè)有意義的名字普泡。
在這里播掷,問題描述中“輸入”审编,“獲取”等關(guān)鍵字會給你指導(dǎo)撼班,你也可以和面試官確認(rèn)。在本例中“輸入一個(gè)句子”這一描述說明了這個(gè)函數(shù)應(yīng)該輸入一個(gè)字符串參數(shù)垒酬。
所以你已經(jīng)確定了參數(shù)的類型砰嘁。但是參數(shù)名稱呢件炉?聽起來也許很簡單,但是好的命名是一項(xiàng)至關(guān)重要的編程技巧矮湘,這需要練習(xí)斟冕。
你可以命名為“sentenceString”,但是命名為“sentence”相比更簡潔缅阳,并仍然清晰地表明我們處理的是字符串磕蛇。
這只是第一步,你還需要為函數(shù)取一個(gè)有意義的名稱十办。在本例中“l(fā)ongestWord”既準(zhǔn)確又具有描述性秀撇。好了現(xiàn)在你已經(jīng)決定了這一點(diǎn),你可以像這樣寫下一個(gè)函數(shù):
function longestWord(sentence){
}
“R”代表返回
這個(gè)函數(shù)返回什么向族?一個(gè)數(shù)字呵燕?一個(gè)boolean值?還是一個(gè)字符串件相?
請牢記:函數(shù)的返回不等同于它在print或者log語句中顯示的內(nèi)容(如果有print或者log輸出的話)再扭。
同樣的,你可以查看問題的描述來確認(rèn)返回內(nèi)容夜矗》悍叮“返回最長的單詞”告訴你需要返回一個(gè)單詞,單詞也就是字符串∥伤海現(xiàn)在我們可以創(chuàng)建一個(gè)變量來代表返回值并放置到你的函數(shù)中敦跌。盡管你還不能返回一個(gè)正確的結(jié)果,但是你已經(jīng)設(shè)置了一個(gè)正確的返回類型逛揩。你已經(jīng)創(chuàng)建了一個(gè)占位符柠傍,這使得我們更容易進(jìn)行下一步。
function longestWord(sentence){
var word = "placeholder";
return word;
}
“E”代表示例
即使是專家級的開發(fā)者辩稽,靜止的代碼也沒有運(yùn)行起來的代碼好理解惧笛。你需要盡快的讓你的代碼跑起來并保持“活力“。你可以通過一個(gè)測試用例來給你的函數(shù)注入活力逞泄。
你知道如果給你的函數(shù)輸入”I saw a hippopotamus,“這個(gè)句子患整,只要正確運(yùn)行它應(yīng)該返回字符串”hippopotamus“。但是現(xiàn)在喷众,你只需要看一下上一步設(shè)置的占位符來確認(rèn)代碼已經(jīng)設(shè)置正確并能夠跑起來各谚。
function longestWord(sentence){
var word = "placeholder";
return word;
}
console.log(longestWord("I saw a hippopotamus"));
最后一個(gè)字母“P”代表偽代碼
現(xiàn)在是不是已經(jīng)蠢蠢欲動準(zhǔn)備編碼了,但是現(xiàn)在開始編碼會很容易陷入一些細(xì)節(jié)從而分散你解決整體問題的注意力到千。首先你需要設(shè)計(jì)一個(gè)策略昌渤,而偽代碼就是針對這種情形的策略。
偽代碼是一系列用口頭語言寫成的精確語句憔四,描述了你需要做什么膀息。
function longestWord(sentence){
// 用一個(gè)變量來保存目前為止最長的單詞
var word = "placeholder";
//將句子轉(zhuǎn)換成一組單詞般眉,以便我們能夠遍歷每一個(gè)單詞。
// 遍歷每一個(gè)單詞潜支。
//如果當(dāng)前單詞的比目前為止最長的單詞還長甸赃,更新保存最長單詞的變量
// 在檢查完所有的單詞后,返回保持最長單詞的變量
return word;
}
//只要代碼運(yùn)行正常冗酿,log應(yīng)該輸出“hippopotamus”〔憾裕現(xiàn)在它應(yīng)該輸出“placeholder”
console.log(longestWord("I saw a hippopotamus"));
你已經(jīng)完成了PREP。現(xiàn)在可以編碼了裁替!
PREP的四個(gè)步驟已經(jīng)幫助你清晰的表述了問題并且想到了怎么去解決它鸠窗。事實(shí)上,框架搭好了胯究,事情就成了一半了稍计。大多數(shù)面試官會對你的有條不紊印象深刻裕循。在這一點(diǎn)上臣嚣,你的目標(biāo)就是編碼并使你的樣例和測試通過。你可以對偽代碼的每一步編碼來實(shí)現(xiàn)這目標(biāo)剥哑。
當(dāng)你的代碼能夠跑起來并看到正確的輸出時(shí)硅则,你已經(jīng)獲得了可以運(yùn)行的解決方案。
function longestWord(sentence){
// 用一個(gè)變量來保存目前為止最長的單詞.
var longestWordSoFar = "";
// 將句子轉(zhuǎn)換成一組單詞株婴,以便我們能夠遍歷每一個(gè)單詞
var wordArray = sentence.split(" ");
var currentWord;
// 遍歷每一個(gè)單詞
for (var i = 0; i < wordArray.length; i++){
currentWord = wordArray[i];
// 如果當(dāng)前單詞的比目前為止最長的單詞還長困介,更新保存最長單詞的變量
if (currentWord.length > longestWordSoFar.length){
longestWordSoFar = currentWord;
}
}
// 在檢查完所有的單詞后大审,返回保持最長單詞的變量
return longestWordSoFar;
}
// 只要代碼運(yùn)行正常,log應(yīng)該輸出“hippopotamus”
console.log(longestWord("I saw a hippopotamus"));
現(xiàn)在你已經(jīng)完成了最困難的部分座哩。你可以長舒一口氣徒扶,至少已經(jīng)有一個(gè)可以運(yùn)行的解決方案。這時(shí)根穷,還有兩個(gè)問題需要思考:
- 是否存在一些邊界條件會使代碼崩潰姜骡?例如,你有考慮句末有句號的情形嗎屿良?你需要為這些邊界條件寫更多的測試用例圈澈,在必要的情況下修改代碼。
- 你能夠把代碼整理得更整潔尘惧、或者更高效嗎康栈?在貿(mào)然解決問題之前你應(yīng)該與面試官討論讓他知道你的想法。
好了,就這么多谅将。整個(gè)過程第一次看起來有點(diǎn)過于呆板漾狼,但是請相信我重慢,這將成為第二自然--就像學(xué)習(xí)駕駛一樣饥臂。即使已經(jīng)編程超過12年,在解決問題是我仍然會遵循這樣的順序似踱。我可能會使用一些正式的測試框架隅熙,而不是像本例中這樣使用log輸出,但是其本質(zhì)是一樣的核芽。
現(xiàn)在你也來試一試囚戚?這里有幾個(gè)入門級的問題你可以用來練習(xí),總體由易到難的順序:
- 1轧简、加入你有一個(gè)字符串?dāng)?shù)組[ “adios”, “bye”, “ciao” ]驰坊。你的任務(wù)是寫一個(gè)total_characters函數(shù),接收這個(gè)數(shù)組作為參數(shù)返回?cái)?shù)組中所有字符的總和哮独。
- 2拳芙、寫一個(gè)函數(shù),拋硬幣n次皮璧,計(jì)算出現(xiàn)“人頭”的次數(shù)舟扎。
- 3、我們會給你一個(gè)包含兩個(gè)數(shù)的數(shù)組悴务,返回這兩個(gè)數(shù)的和以及這兩個(gè)數(shù)之間的所有數(shù)睹限。注意最小的數(shù)不一定總是在第一個(gè)。嘗試使用自己先使用PREP來完成框架讯檐,并且隨時(shí)都可以到這里確認(rèn)并完成最后的解決方案羡疗。摘自Free Code Camp
PREP已經(jīng)幫助數(shù)位學(xué)員通過了他們的代碼面試,我希望對你也有所幫助别洪。Happy coding!
本文譯自有著12年編程經(jīng)驗(yàn)的 First Step Coding創(chuàng)始人Andy Tiffany 的經(jīng)驗(yàn)分享顺囊。
閱讀原文請戳When it comes to whiteboard coding interviews, remember to PREP