日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
只有程序員看的懂的面試圣經(jīng)|如何拿下編程面試

當(dāng)我最初開始參加編程面試的時(shí)候,我所有最心儀的公司都忽視了我。現(xiàn)在回頭看那個(gè)時(shí)候,我發(fā)現(xiàn)自己當(dāng)時(shí)去參加面試都完全沒做任何準(zhǔn)備。雖然已經(jīng)有許 多博客文章和書籍在講編程面試,但現(xiàn)在的我作為面試官,坐在桌子的另一邊,還是能看到許多來參加編程面試的人沒做任何準(zhǔn)備,或者準(zhǔn)備得很糟糕。這也就是為 什么我開始寫這篇指南的原因,剛畢業(yè)時(shí)的我、第一次參加面試的我一定非常想有這么一份指南來指引自己。而從現(xiàn)在開始,我自己也會照著這份指南去做。

多年以來,我在好幾家公司工作過,所以我的面試技巧得到了很好的磨煉,而且我參與面試的過程也教會了我該說什么、該做哪些準(zhǔn)備,以及如何面試。在這 篇指南里,你會了解到面試的概況、面試取得成功的六大步驟,以及我在考察數(shù)據(jù)結(jié)構(gòu)和算法時(shí)所考慮的方面。這篇指南無法確保你找到工作,但它能幫助你盡最大 可能給面試官留下一個(gè)好印象。

聲明:本文中的觀點(diǎn)完全出自個(gè)人視角,與我目前或者以前的雇主沒有關(guān)系。

 試過

本節(jié)概述了硅谷公司的面試過程,僅僅是個(gè)情況介紹,大家可以跳過去往后看。

除了直接申請面試以外,一般說來,還有兩種途徑來獲得面試的機(jī)會:由現(xiàn)在的雇主推薦,或者通過LinkedIn。雖然前者會快一些、更尊敬一些,但后者很可能是大部分應(yīng)聘者所走的路徑。事實(shí)上,每天都有無數(shù)的招聘人員趴在LinkedIn上,他們唯一的工作就是尋找和接觸有可能換工作的員工,所以一定要保證自己的信息是最新的,而且要多交人脈、多請別人來認(rèn)可自己的技能,并且要把你所具備的技能、做過的個(gè)人項(xiàng)目或者對開源軟件所做的貢獻(xiàn)加到個(gè)人頁面里去。

最初的接觸一般是通過電子郵件進(jìn)行的,然后招聘人員會給你打電話,大概了解一下你的技術(shù)背景。如果你的技能和他們正在尋找的技能一致,他們就會安排一次電話面試, 在電話面試時(shí),你可能就會被要求在一份共享的在線文檔里編程。那么你就會知道,這份文檔很可能沒有任何代碼補(bǔ)全和句法高亮的功能。電話面試會持續(xù)半小時(shí)到 45分鐘,如果你表現(xiàn)不錯(cuò),就會被邀請去參加現(xiàn)場面試。現(xiàn)在如果沒有電話面試、或者在電話面試之外,你可能還得去參加一個(gè)小的編程項(xiàng)目。

現(xiàn)場面試由幾次面試組成,總體會持續(xù)45分鐘到一個(gè)小時(shí)。這些面試會和電話面試非常像,只是問題會更難——不過 能親眼見到面試官多少算是有所補(bǔ)償?,F(xiàn)場面試數(shù)周之后,所有反饋應(yīng)該都被看過、招聘決定就會做出,招誰不招誰也就定了。如果你沒拿到offer,也要明白 面試是一個(gè)隨機(jī)的過程,包含運(yùn)氣的成分,不妨把它看作是一次學(xué)習(xí)的經(jīng)歷??赡苣氵€會想起布萊恩·阿克頓(Brian.Acton)面試Facebook和Twitter不成、后來成為WhatsApp聯(lián)合創(chuàng)始人的故事。

理論上講,用哪種編程語言并不重要,但你面試需要用某種特定語言來完成的工作時(shí)除外,比如iPhone開發(fā)者或者前端開發(fā)者。我強(qiáng)烈建議你用正在面試的公司所使用的一種編程語言來編程(以及練習(xí)面試問題)。

#p#

試獲得成功的六個(gè)步

編程面試的目的,是為了確定你的編程水平有多高。一般來說,你將被要求用編程來完成一個(gè)功能或者方法,但有時(shí)候,你會需要編輯一個(gè)類的定義,或者設(shè)計(jì)一系列相關(guān)的代碼模塊。在任何一種情況下,你都要有條不紊地解決問題,并遵循以下六個(gè)步驟:

  1. 首先,要確保你理解了面試官的問題。許多問題都是故意措辭模糊或者模棱兩可,這個(gè)時(shí)候你可以請面試官把問題說清楚,從而確保你真正回答面試官的問題。你的提問同時(shí)還有一個(gè)好處,就是它能給你自己一些時(shí)間,讓你的腦子轉(zhuǎn)起來。

  2. 用一到兩個(gè)例子來確定問題的限制條件和要求(在現(xiàn)場面試時(shí)在白板上完成這個(gè)過程,在電話面試時(shí)在筆記本上完成)。嘗試用中等規(guī)模的例子,以便覆蓋到一些特殊情況。如果你能想到可能相關(guān)的表格,就把它畫出來。事實(shí)上,把你想到的任何東西都寫下來是會有幫助的,因?yàn)樗転槟闾峁┮粋€(gè)視覺錨點(diǎn),從而讓你在走不通時(shí)或者思考過程中隨時(shí)返回某一個(gè)點(diǎn)。

  3. 把話說清楚,這可能是最重要的一步。要試著讓面試盡可能有更多的互動,面試官不知道你在想什么,而讓他們參與到你的思考過程里,會讓她給你一些有用的提示,防止你偏向錯(cuò)誤的方向。你的目標(biāo)就是要先和面試官確證你的答案,然后再去寫代碼,而且你考慮答案越清晰、越高效,你得到的即時(shí)反饋也就越好。

  4. 通過應(yīng)用以下技巧來找到答案:回想一下你遇到的類似問題,再想想它們是如何被解決的,嘗試各種不同的算法(分 治算法、貪心算法、遞歸、排序,等等),把問題分解成更小的、可處理的小問題(這樣你就能得到相應(yīng)部分的分?jǐn)?shù)),最后再通覽一遍你列出的數(shù)據(jù)結(jié)構(gòu),因?yàn)橛?時(shí)候,只要想到了正確的數(shù)據(jù)結(jié)構(gòu),就能給出正確的答案。

  5. 當(dāng)你向面試官問清楚了問題、并向她解釋了你的答案之后,就可以開始寫代碼了。要記住,在共享文檔里寫代碼的時(shí) 候,你可以復(fù)制粘貼、寫評論,而且能回過頭來完成骨架算法和功能。但在白板上寫代碼就不一樣了,它需要你的頭腦很清醒,而且需要你具備管理白板空間的技 能。如果足夠幸運(yùn)的話,現(xiàn)在當(dāng)你開始在白板左上角動筆的時(shí)候,應(yīng)該非常明白你要寫些什么東西,而且你要確保在你寫答案的時(shí)候,沒有擋住面試官的視線?;c(diǎn) 兒時(shí)間把代碼寫得緊湊而美觀一點(diǎn)兒,因?yàn)槟愕拇a也會是面試反饋的一部分。在你寫代碼的時(shí)候,要大聲解釋你在寫什么,這會讓你的面試官更容易地跟上你的思 路。

  6. 最后,用不同的例子和特殊案例驗(yàn)證一下你的代碼,并且要一行一行地過。這會展示你的思考過程,讓你檢查出小錯(cuò)誤,并告訴面試官你的辦法是可行的。如果你想得到額外加分的話,甚至可以把單元測試的代碼寫下來!最后再和面試官聊一下你的答案在空間和時(shí)間利用方面的復(fù)雜性,然后結(jié)束整場面試。

#p#

中提示出的問題

電話面試值得特別一提,因?yàn)檫@是大多數(shù)人失利的地方。之所以會這樣,部分原因在于電話面試是招聘過程中第一道真正的關(guān)卡,但也有一部分原因在于,這種形式容易造成溝通的錯(cuò)誤,而且缺乏可視化線索,所以電話面試是特別嚴(yán)酷的。

電話面試有兩大障礙。第一大障礙是,在電話面試的一開始,雙方都能看到的唯一的東西就是一個(gè)空白的共享文檔。這 會讓面試者傾向于過度補(bǔ)償非語言溝通的缺失,從而著急忙慌地在屏幕上進(jìn)行溝通。令人遺憾的是,這么做很少會有好結(jié)果。所以當(dāng)務(wù)之急并不是去關(guān)注那個(gè)正在盯 著你的空白文檔,而是要首先理解和評估問題(也就是完成上述六個(gè)步驟中的前四個(gè)),同時(shí)通過盡可能地沉浸到面試中來彌補(bǔ)現(xiàn)實(shí)存在感的缺失(要記住,電話的 另一頭是一位可以很容易就被別的事情[比如查看郵件]分心的面試官)。

電話面試的第二大障礙,就是要同時(shí)在電腦上打字和在電話上聊天的后勤保障問題。你不必一只手敲代碼、一只手打電話,也不必把電話調(diào)到揚(yáng)聲器模式,我建議你用電腦上的Google Hangouts接面試電話(你得有一個(gè)GoogleVoice號碼,而且得在面試前測試一下)。你還可以用耳麥或者耳機(jī)來進(jìn)一步降低不好的接收效果、提高溝通質(zhì)量。

算法+數(shù)據(jù)結(jié)構(gòu)=程序

如果你正在思考為什么軟件工程的面試和日常編程不一樣,那你可能有興趣讀一下Quora上的這條回答。最根本的原因在于:面試是為了測試你在計(jì)算機(jī)技術(shù)方面的基礎(chǔ),所以會非常偏重算法和數(shù)據(jù)結(jié)構(gòu),因此你可能需要練習(xí)一些面試問題,從而讓自己具備解決面試問題的心態(tài)。

從短期來看,你所能做的最好的準(zhǔn)備工作就是買一塊白板,并通讀一遍《程序員面試金典(Cracking The Code Interview)》,里面都是很好的建議,而且里面的許多面試問題和答案會幫助你確定問題所在,并匹配好回答模式。請參閱本指南最后列出的常用面試問題。

當(dāng)然了,長遠(yuǎn)來看,我們都會死掉,所以我會把事情搞簡單,說一些你絕對應(yīng)該復(fù)習(xí)一下的關(guān)鍵概念。

數(shù)組/字符串

大部分?jǐn)?shù)組和字符串是可互換的,事實(shí)上,你遇到的大部分字符串處理的問題,都可以在理解數(shù)組的基礎(chǔ)上得到解決。記住這一點(diǎn)之后,你應(yīng)該懂得如何遍歷數(shù)組,知道如何訪問、轉(zhuǎn)換和調(diào)換其中的每一個(gè)元素,而且要懂得如何對它們進(jìn)行各種不同的集合運(yùn)算。和其他算法相比,二分法檢索(Binary search)可能會更多地成為面試問題的核心內(nèi)容(如果你曾經(jīng)碰到過有分類數(shù)組的問題,那么二分法檢索有可能應(yīng)該是你答案的一部分),你絕對必須知道如何使用它。

排序

和數(shù)組密切相關(guān)的,是排序算法。你不大可能會被要求重復(fù)使用一個(gè)排序算法,但很可能你至少知道排序是如何在O(nlogn)的時(shí)間里完成的就行。不過你應(yīng)該大概知道歸并排序(merge sort)或者快速排序(quicksort)和基數(shù)排序(radix sort)的執(zhí)行細(xì)節(jié)。

動態(tài)數(shù)組/可增數(shù)組

動態(tài)數(shù)組可以按需重新調(diào)整自己的大小,同時(shí)依然提供分時(shí)平攤的持續(xù)時(shí)間訪問。一種典型的做法是,當(dāng)在一個(gè)全排列數(shù)組中增加一個(gè)元素的時(shí)候,會形成一個(gè)新的、更大的數(shù)組,而舊數(shù)組中的元素也會被復(fù)制到新數(shù)組里。你應(yīng)該在面試時(shí)做到完成一個(gè)動態(tài)數(shù)組。

如果你拿到一個(gè)非數(shù)組類問題,但你在答題中需要用到像數(shù)組結(jié)構(gòu)這樣的數(shù)組,不妨少給自己惹麻煩,直接用動態(tài)數(shù)組吧。

哈希映射/哈希表/詞典/哈希集合

哈希表(Hash tables)是編程時(shí)的瑞士軍刀,很多不同類型的問題(檢查存在、計(jì)算頻率、排序,等等)都能用哈希表來完美解決。它幾乎肯定會出現(xiàn)在你的面試中,而你應(yīng)該理解它的原理(哈希功能的角色、沖突如何解決、什么時(shí)候要調(diào)整大小、為什么)以及如何運(yùn)用它們。

鏈表

鏈表問題在C和C++的面試中最常見,因?yàn)樗鼈兪桥宄?yīng)聘者是否理解指針的一種簡單的辦法。不過這個(gè)點(diǎn)太初級、太基礎(chǔ)了,所以不管用哪種語言,你 都應(yīng)該知道該如何從零做起應(yīng)用它們。而且由于大部分鏈表問題不過是與人所周知的遍歷還有刪除和插入相關(guān)的問題的變體,所以鏈表問題準(zhǔn)備起來很容易,你沒有 理由拿不到這部分分?jǐn)?shù)。

許多鏈表問題中都會用到一個(gè)小技巧,那就是慢速/快速指針技術(shù)。它的簡單版含義如下:使用兩個(gè)指針迭代生成一個(gè)列表,其中一個(gè)指針在另一個(gè)指針的前 面??焖倌J较碌闹羔樋赡軙且粋€(gè)位于前面的固定數(shù)值(它有助于確定列表有無循環(huán),或者找到列表中的第k個(gè)元素),或者也可能會跳過慢速指針經(jīng)過的多個(gè)結(jié) 點(diǎn)(打個(gè)比方,如果快速指針的速度是慢速指針的兩倍,那么當(dāng)它到達(dá)列表末尾時(shí),慢速指針將會位于列表的中間)。

請注意,當(dāng)面試官談到鏈表時(shí),他們常常指的是單鏈表,但你無論如何都應(yīng)該問清楚。

棧/隊(duì)列

棧和隊(duì)列一般會是你用來解題的數(shù)據(jù)結(jié)構(gòu)的一部分。你應(yīng)該知道如何用鏈表和數(shù)組兩種方式來實(shí)現(xiàn)它們。

加練兩道題:利用兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)棧,以及利用兩個(gè)棧來實(shí)現(xiàn)一個(gè)隊(duì)列。

樹/二叉樹/二叉搜索樹(BST)/字典樹/堆

你可能不會每天都見到樹和圖,但你很可能會在面試時(shí)遇到它們,所以你要徹底地看一下這些數(shù)據(jù)結(jié)構(gòu)。

樹最一般的定義,是和其他結(jié)點(diǎn)沒有或者有一個(gè)以上關(guān)系的結(jié)點(diǎn)的集合,但在實(shí)踐中,當(dāng)面試官說“”的時(shí)候,他們指的是一種叫二叉樹的東西。二叉樹是一種樹的類型,它的每個(gè)結(jié)點(diǎn)都至多有兩個(gè)子樹,一般被稱為左子樹和右子樹。

你不應(yīng)該把二叉樹二叉搜索樹混淆起來,后者是一種特殊的二叉樹,它的左子 樹結(jié)點(diǎn)上的值都比父結(jié)點(diǎn)小,而右子樹結(jié)點(diǎn)上的值都比父結(jié)點(diǎn)大或者相等。二叉搜索樹的優(yōu)點(diǎn)是,如果樹的結(jié)構(gòu)相對平衡(向面試官問清楚這個(gè)問題),那么查找、 插入和刪除就可以在O(log n)的時(shí)間里完成。二叉搜索樹的其他重要屬性,就是你跟著所有的左子樹走,就能得到這個(gè)樹上最小的元素,而跟著所有的右子樹走,就能得到這個(gè)樹上最大的元 素。

請注意,是有辦法讓樹一直保持平衡的,最常用的辦法就是紅黑樹和AVL樹。我不會去弄清楚它具體實(shí)現(xiàn)的細(xì)節(jié),只要知道有這些數(shù)據(jù)結(jié)構(gòu)就行。

不過你絕對必須知道遍歷樹(tree traversal)算法:廣度優(yōu)先搜索(breadth-first-search)、深度優(yōu)先搜索(depth-first-search),以及中序遍歷、后序遍歷前序遍歷之間的差別。

以下是在Java實(shí)現(xiàn)中序遍歷的例子,它可以打印出一個(gè)樹的所有值(前序遍歷和后序遍歷幾乎和這個(gè)一樣):

 
 
  1. void inOrderTraversal(Node root) {

  2. if (root == null) return;

  3. inOrderTraversal(root.getLeft());

  4. // Do something with the value

  5. System.out.println(root.getValue());

  6. inOrderTraversal(root.getRight());

  7. }

字典樹(trie)(讀 “tree”)常常被用在字符串問題里,它是一個(gè)n元樹,除了根結(jié)點(diǎn)以外的每個(gè)結(jié)點(diǎn)都代表一個(gè)字符或者部分或完整的單詞,而且沿著樹的每一條路徑都代表一 個(gè)單詞。實(shí)際上它真的沒有聽起來那么復(fù)雜,只要讀一下維基百科上的頁面、了解該如何構(gòu)建一個(gè)字典樹以及如何查詢其中的數(shù)值就行。請注意,你可以通過前序遍 歷輸出字典樹中的所有鍵。作為一個(gè)練習(xí),你可以想一想自己會如何利用字典樹實(shí)現(xiàn)自動完成功能。

最后是堆(heaps),它也被稱為優(yōu)先隊(duì)列,是你應(yīng)該了解的最后一種數(shù)據(jù)結(jié)構(gòu)。它們通常都是滿足堆屬性的二叉樹:每個(gè)結(jié)點(diǎn)的子樹的值都比結(jié)點(diǎn)本身的值小,或者與它相等。所以根結(jié)點(diǎn)的值總是最大的,也就是說你總能找到最大值,但代價(jià)就是尋找其他任何一個(gè)值所需的時(shí)間都是O(n)。插入和刪除所需的時(shí)間依然是O(log n)。

有向圖/無向圖/加權(quán)圖

和樹一樣,圖也是由帶子集的結(jié)點(diǎn)組成的,但和樹不一樣的地方在于,這些結(jié)點(diǎn)可以有多個(gè)父結(jié)點(diǎn),所以可能會形成自環(huán)(loop)或者圈(cycle)。除了鏈接——也被稱作邊(edges)——之外,兩個(gè)結(jié)點(diǎn)之間可能地有比指針更多的信息,而且可能會有值和權(quán)重。邊有方向的圖被稱為有向圖,而只有雙向指針的圖被稱為無向圖。邊上有權(quán)重的圖被稱為加權(quán)圖。

有三種方法來表示圖,但你只要搞清楚鄰接矩陣(adjacency matrices)和鄰接表(adjacency lists)就行了。你應(yīng)該了解它們計(jì)算的復(fù)雜程度、它們需要折衷的地方,以及如何在現(xiàn)實(shí)的代碼中實(shí)現(xiàn)它們。用哪種方法取決于你有的圖的類型,比如連接完整的簡單圖可能用鄰接矩陣來實(shí)現(xiàn)更好,而稀疏一些的圖則可能用鄰接表來表示更好。

請注意,如果你是在實(shí)現(xiàn)加權(quán)圖,很可能需要定義一個(gè)Edge類。

圖論是一個(gè)非常寬泛的話題,所以很難知道一個(gè)人應(yīng)該為一場面試去熟悉多少種圖論算法,所以我只是列出了我認(rèn)為可以覆蓋90%圖論問題的內(nèi)容:你絕對必須知道該如何遍歷一個(gè)圖(深度優(yōu)先或者廣度優(yōu)先),以及如何做拓?fù)渑判颍╰opological sorting),你應(yīng)該知道如何實(shí)現(xiàn)迪杰斯特拉(Dijkstra)的最短路徑算法(這里有一個(gè)制作精巧的視頻解釋了這一算法),同時(shí)也要知道如何實(shí)現(xiàn)普里姆(Prim)算法。最后,如果你還知道如何實(shí)現(xiàn)A*搜索算法,那就更好了。

#p#

其他數(shù)據(jù)結(jié)構(gòu)

使用以上數(shù)據(jù)結(jié)構(gòu),你就可能解決絕大多數(shù)問題了,但也請盡管在這個(gè)部分下留言,為其他讀者推薦其他數(shù)據(jù)結(jié)構(gòu)。

位操作

要想處理位元,你必須先得知道在二進(jìn)制補(bǔ)碼(two’s complement)標(biāo) 記內(nèi)部,數(shù)字是如何表示的——二進(jìn)制補(bǔ)碼和無格式二進(jìn)制標(biāo)記是一樣的,只是負(fù)數(shù)要“進(jìn)行位元翻轉(zhuǎn)之后再加1”。比如要想得到數(shù)字-1,你要從用8位二進(jìn)制 整數(shù)表示是00000001的1開始。對每一個(gè)位元進(jìn)行翻轉(zhuǎn)之后的結(jié)果是11111110,再加上1就是11111111,也就成了二進(jìn)制補(bǔ)碼中的-1。

左移位運(yùn)算符“<<”會把位元移向左邊,用0來補(bǔ)上移走之后的空位。

右移位運(yùn)算符“>>”會把一個(gè)位模式向右移,但當(dāng)向右移動負(fù)數(shù)時(shí),它的作用在不同編程語言中也不一樣,在Java中,右移位會用符號擴(kuò)充的辦法,用1來填充負(fù)數(shù)中的空位。

邏輯右移位運(yùn)算符“>>>”是Java和Javascript中獨(dú)有的,無論數(shù)值是多少,它都用0來填充空位。

設(shè)置某一位:可以用按位或運(yùn)算符(|)。

 
 
  1. num |= 1 << x; //這行代碼將會設(shè)置位元x

清除某一位:可以用按位與運(yùn)算符(&),并且用取反運(yùn)算符(~)來屏蔽所有你不想清除的位元。

 
 
  1. num &= ~(1 << x); //這會清除位元x

清除一直到i的所有有效位元

 
 
  1. num &= (1 << (i + 1)) -1;

切換某一位元:可以用按位異或運(yùn)算符(^)

 
 
  1. num ^= 1 << x; //這會切換位元x

獲得一個(gè)位元:對你想檢查的位元用按位與

 
 
  1. bit = num & (1 << x);

設(shè)計(jì)模式/面向?qū)ο缶幊?/p>

和面向?qū)ο缶幊滔嚓P(guān)的問題,一般會涉及到設(shè)計(jì)相關(guān)類里的集,以便檢驗(yàn)?zāi)銓γ嫦驅(qū)ο缶幊痰氖煜こ潭龋⒘私饽闶侨绾渭軜?gòu)代碼的。你可以使用界面和/或抽象的類來說明,并記住用單例模式(Singleton)、工廠方法模式(Factory)和策略模式(Strategy)來解決這類問題,在編寫優(yōu)雅而可維護(hù)的代碼方面,它們能對你有長久的助益。

編程應(yīng)該知道的事情

要知道如何用你正在使用的編程語言來讀取寫入文件,并且要知道如何生成隨機(jī)數(shù)。

數(shù)學(xué)

你并不是在面試數(shù)學(xué)相關(guān)的職位,但考慮到我們被計(jì)數(shù)和測量的問題所包圍,所以有一些數(shù)學(xué)概念也成了編程面試時(shí)關(guān)注的東西,比較重要的有質(zhì)數(shù)、進(jìn)制轉(zhuǎn)換(base conversions)和一些基本的組合數(shù)學(xué)。

對于質(zhì)數(shù),要大概知道為什么它們很重要,并且要知道每一個(gè)數(shù)都可以被分解成質(zhì)數(shù)的和。你還得知道如何實(shí)現(xiàn)埃拉托斯特尼篩法(sieve of Eratosthenes)。

對于基本的組合數(shù)學(xué),你得知道排列和組合。

排列是對一個(gè)集合中的數(shù)按照一定的次序或者順序進(jìn)行整理。比如對于集合{1,2,3},就有6種排列的方式,也就是(1,2,3)、(1,3,2)、(2,1,3)、(2,3,1)、(3,1,2)和(3,2,1)。n個(gè)不同數(shù)字的排列方式一共有n!種。

還有一種排列叫部分排列,也就是從n個(gè)數(shù)字的集合中取出k個(gè)不同的元素,然后再進(jìn)行排序。這種排列可以用下面的公式來表達(dá):

部分排列公式

組合則是從一個(gè)組里選擇成員的一種方法,因此選擇的順序并不重要。比如一手牌可以被描述成是從52張一摞的牌堆(n=52)中選出5張組成一組(k=5)。從有n個(gè)元素的集合中挑出k個(gè)元素,當(dāng)k>n時(shí),不存在相應(yīng)的組合,否則這k個(gè)元素的組合的數(shù)量可以用下面的公式來表達(dá):

當(dāng)k<=n時(shí),從有n個(gè)元素的集合中挑出k個(gè)元素的組合形式數(shù)量的一般公式。

并發(fā)

并發(fā)問題在面試中并不常見,但也確實(shí)有過,所以你肯定不想到時(shí)候毫無準(zhǔn)備,那就再去看一下如何生成線程、使用同步以及鎖定對共享資源的訪問,并理解會導(dǎo)致死鎖(deadlocks)的幾種情況。準(zhǔn)備這個(gè)話題有一個(gè)好辦法,那就是去做出來一個(gè)你最喜歡的數(shù)據(jù)結(jié)構(gòu)的同步版本。 

試時(shí)的行為舉

  • 做些功課,了解一下要面試的公司,了解一下你自己,以及為什么你要去這家公司。要理解公司在做的事、你的新工作涉及哪些東西,以及它最讓你激動的地方是什么。換工作是件大事,所以要認(rèn)真對待它,提前做些研究。

  • 保持積極心態(tài)。保持一個(gè)好的情緒,要微笑,不要談?wù)摵湍悻F(xiàn)在或者之前的工作有關(guān)的負(fù)面信息,當(dāng)描述挑戰(zhàn)的時(shí)候,要保持樂觀的語調(diào),并強(qiáng)調(diào)你從中學(xué)到的積極的東西。

  • 本條是前一條里說的不要向面試官傳遞負(fù)面信息的必然結(jié)果。一些面試官會問你現(xiàn)在感覺如何,千萬別說你之前受不了某一位或兩位面試官,一定要說所有事情都非常好。

  • 要保持激情!要讓你的激動之情閃亮全場,并展示出你對軟件開發(fā)、技術(shù)和解決重大問題的熱情。

  • 要問問題。要真正對你的面試官每天都在做什么抱有真正的興趣,問問他們工作中遇到的機(jī)遇與挑戰(zhàn),提前準(zhǔn)備幾個(gè) 程式化的問題,顯示一下你對公司和這個(gè)職位的興趣。不過無論你做什么,都別問對方“你感覺如何”。首先,你很可能會收到同樣程式化的回答,其次,把面試你 的人擺在那樣一個(gè)位置上,也不是什么好主意。

  • 保持親切感,并形成閉環(huán)。當(dāng)你結(jié)束面試之后,給招聘你的人發(fā)一句簡短的感謝語,讓他們知道你對這次面試的感覺。

  • 回想你學(xué)到的東西。無論結(jié)果如何,你都能學(xué)到一些東西——可以是知識上的某個(gè)缺失,也可以是新的面試問題——所以要做自我反思,從自己的經(jīng)歷中學(xué)習(xí)。

祝各位職場和面試好運(yùn)!

來源:簡書    原文:https://medium.com/@declercq/how-to-crush-the-coding-interview-1fc8a4695d7c 作者: Stefan De Clercq
譯文:http://www.jianshu.com/p/d34c335a6cfd/comments/766555 譯者: Nextoffer


本文標(biāo)題:只有程序員看的懂的面試圣經(jīng)|如何拿下編程面試
本文來源:http://m.5511xx.com/article/cojssse.html