面試寫代碼?請記住PREP

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蕉拢,隨后出現(xiàn)的幾起案子特碳,更是在濱河造成了極大的恐慌,老刑警劉巖晕换,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件午乓,死亡現(xiàn)場離奇詭異,居然都是意外死亡闸准,警方通過查閱死者的電腦和手機(jī)益愈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒸其,你說我怎么就攤上這事敏释。” “怎么了摸袁?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵钥顽,是天一觀的道長。 經(jīng)常有香客問我靠汁,道長蜂大,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任蝶怔,我火速辦了婚禮奶浦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踢星。我一直安慰自己澳叉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布沐悦。 她就那樣靜靜地躺著成洗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪所踊。 梳的紋絲不亂的頭發(fā)上泌枪,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音秕岛,去河邊找鬼碌燕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛继薛,可吹牛的內(nèi)容都是我干的修壕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遏考,長吁一口氣:“原來是場噩夢啊……” “哼慈鸠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起灌具,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤青团,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后咖楣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體督笆,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年诱贿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娃肿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咕缎。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖料扰,靈堂內(nèi)的尸體忽然破棺而出凭豪,到底是詐尸還是另有隱情,我是刑警寧澤晒杈,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布嫂伞,位于F島的核電站,受9級特大地震影響桐智,放射性物質(zhì)發(fā)生泄漏末早。R本人自食惡果不足惜烟馅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一说庭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郑趁,春花似錦刊驴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梭纹,卻和暖如春躲惰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背变抽。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工础拨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绍载。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓诡宗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親击儡。 傳聞我的和親對象是個(gè)殘疾皇子塔沃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評論 0 4
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,575評論 1 118
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法阳谍,內(nèi)部類的語法蛀柴,繼承相關(guān)的語法,異常的語法矫夯,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 文物收藏界很有收藏價(jià)值的宣德爐茧痒,是中國歷史上第一次運(yùn)用黃銅鑄成的銅器肮韧。為制作精品的銅爐,皇帝親自參與設(shè)計(jì)和制作,這...
    春水流閱讀 2,029評論 0 3
  • 眼鏡 易志弄企,杜秀美超燃。 會是你嗎?那個(gè)讓人模糊不透的人拘领。 會是你嗎意乓?那個(gè)可以代替我的人。 模糊不透的人指自己的眼睛和...
    導(dǎo)演張升志閱讀 320評論 0 0