1. 程式人生 > >程式設計師求職之道(《程式設計師面試筆試寶典》)之如何回答演算法設計問題?

程式設計師求職之道(《程式設計師面試筆試寶典》)之如何回答演算法設計問題?

程式設計師面試中,很多演算法設計問題,都是歷年來各家企業的“炒現飯”,不管求職者以前對演算法知識學習得是否紮實,理解得是否深入,只要面試前買本《程式設計師面試筆試寶典》(備註:編者早前編寫的一本書,機械工業出版社出版),學習上一段時間,牢記於心,應付此類題目完全沒有問題,但遺憾的是,很多世界級知名企業也深知這一點,如果純粹是出一些毫無技術含量的題目的話,對於考前“突擊手”而言,可能會佔盡便宜,但對於那些技術好的人而言是非常不公平的。所以,為了把優秀的求職者與一般的求職者能夠更好地區分開來,他們越來越傾向於出一些有技術含量的“新”題,這些題目以及答案,不再是以前的陳穀子爛芝麻了,而是經過精心設計的好題。

在程式設計師面試中,演算法的地位就如同是GRE或托福考試在出國中的地位一樣,必須但不是最重要的,它只是眾多考核方面中的一個而已,不一定就能決定求職者的生死。雖然如此,但並非說明就不用去準備演算法知識了,因為演算法知識回答得好,必然會成為面試的加分項,對於求職成功,百利而無一害。那麼如何應對此類題目呢?很顯然,編者不可能將此類題目都在《程式設計師面試筆試寶典》中一一解答,一來由於內容眾多,篇幅有限,二來也沒必要,今年考過了,以後一般就不會再考了,不然還是沒有區分度。編者以為,靠死記硬背肯定是行不通的,解答此類演算法設計問題,需要求職者具有紮實的基本功以及良好的運用能力,編者無法左右求職者的個人基本功以及運用能力,因為這些能力需要求職者“十年磨一劍”地苦學,但編者可以提供一些比較好的答題方法和解題思路,以供求職者在面試時應對此類演算法設計問題。“授之以魚不如授之以漁”,豈不是更好?

(1)    歸納法

此方法通過寫出問題的一些特定的例子,分析總結其中一般的規律。具體而言就是通過列舉少量的特殊情況,經過分析,最後找出一般的關係。例如,某人有一對兔子飼養在圍牆中,如果它們每個月生一對兔子,且新生的兔子在第二個月後也是每個月生一對兔子,問一年後圍牆中共有多少對兔子。

使用歸納法解答此題,首先想到的就是第一個月有多少對兔子,第一個月的時候,最初的一對兔子生下一對兔子,此時圍牆內共有兩對兔子。第二個月仍是最初的一對兔子生下一對兔子,共有3對兔子。到第三個月除最初的兔子新生一對兔子外,第一個月生的兔子也開始生兔子,因此共有5對兔子。通過舉例,可以看出,從第二個月開始,每一個月兔子總數都是前兩個月兔子總數之和,Un+1=Un+Un-1,一年後,圍牆中的兔子總數為377對。

此種方法比較抽象,也不可能對所有的情況進行列舉,所以,得出的結論只是一種猜測,還需要進行證明。

(2)    相似法

正如編者“年年歲歲花相似,歲歲年年仍單身”一樣,此方法考慮解決問題的演算法是相似的。如果面試官提出的問題與求職者以前用某個演算法解決過的問題相似,此時此刻就可以觸類旁通,嘗試改進原有演算法來解決這個新問題。而通常情況下,此種方法都會比較奏效。

例如,實現字串的逆序列印,也許求職者從來就沒遇到過此問題,但將字串逆序肯定在求職準備的過程中是見過的。將字串逆序的演算法稍加處理,即可實現字串的逆序列印。

(3)    簡化法

此方法首先將問題簡單化,例如改變一下資料型別、空間大小等,然後嘗試著將簡化後的問題解決,一旦有了一個演算法或是思路可以解決這個被“閹割過”的問題,再將問題還原,嘗試著用此類方法解決原有問題。

例如,在海量日誌資料中提取出某日訪問xxx網站次數最多的那個IP。很顯然,由於資料量巨大,直接進行排序不可行,但如果資料規模不大時,採用直接排序不失為一種好的解決方法。那麼如何將問題規模縮小呢?於是想到了Hash法,Hash往往可以縮小問題規模,然後在“閹割過”的資料裡面使用常規排序演算法即可找出此問題的答案。

(4)    遞迴法

為了降低問題的複雜度,很多時候都會將問題逐層分解,最後歸結為一些最簡單的問題,這就是遞迴。此種方法,首先要能夠解決最基本的情況,然後以此為基礎,解決接下來的問題。

例如,在尋求全排列的時候,可能會感覺無從下手,但仔細推敲,會發現後一種排列組合往往是在前一種排列組合的基礎上進行的重新排列,只要知道了前一種排列組合的各類組合情況,只需要把最後一個元素插入到前面各種組合的排列裡面,就實現了目標:即先截去字串s[1…n]中的最後一個字母,生成所有s[1…n-1]的全排列,然後再將最後一個字母插入到每一個可插入的位置。

(5)    分治法

任何一個可以用計算機求解的問題所需的計算時間都與其規模有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。而分治法正是充分考慮到這一點內容,將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。分治法一般包含以下三個步驟:1)將問題的例項劃分為幾個較小的例項,最好具有相等的規模;2)對這些較小的例項求解,而最常見的方法一般是遞迴;3)如果有必要的話,合併這些較小問題的解,以得到原始問題的解。

分治法是程式設計師面試常考的演算法之一,一般適用於二分查詢、大整數相乘、求最大子陣列和、找出偽幣、金塊問題、矩陣乘法、殘缺棋盤、歸併排序、快速排序、距離最近的點對、導線與開關等。

(6)    Hash法

很多面試筆試題目,都要求求職者給出的演算法儘可能高效。什麼樣的演算法是高效的?一般而言,時間複雜度越低的演算法越高效。而要想達到時間複雜度的高效,很多時候就必須在空間上有所犧牲,用空間來換時間。而用空間換時間最有效的方式就是Hash法、大陣列、點陣圖法。當然,此類方法並非包治百病,有時,面試官也會對空間大小進行限制,那麼,此時,求職者只能再去思考其他的方法了。

其實,凡是涉及到大規模資料處理的演算法設計中,Hash法就是最好的方法之一。

(7)    輪詢法

每道面試筆試題,在設計時,往往會有一個載體,這個載體便是資料結構,例如陣列、連結串列、二叉樹、圖等,當載體確定後,可用的演算法自然而然地就會暴露出來。可問題是很多時候並不確定這個載體是什麼。當無法確定這個載體時,一般也就很難想到合適的方法了。

編者建議,此時,求職者可以採用最原始的思考問題的方法——輪詢,在腦海中輪詢各種可能的資料結構與演算法,常考的資料結構與演算法一共就那麼一些,即使不完全一樣,也是由此衍生出來的或是相似的,總有一款適合此題的。

表7.1 最常考的資料結構與演算法知識點

資料結構

演算法

概念

連結串列

廣度(深度)優先搜尋

位操作

陣列

遞迴

設計模式

二叉樹

二分查詢

記憶體管理(堆、棧等)

排序(歸併排序、快速排序等)

堆(大頂堆、小頂堆)

樹的插入/刪除/查詢/遍歷等

圖論

佇列

Hash法

向量

分治法

雜湊表

動態規劃

此種方法看似笨拙,其實實用,只要求職者對常見的資料結構與演算法爛熟於心,一點都沒有問題。

為了更好的理解這些方法,求職者可以在平時的準備過程中,應用此類方法去答題,做得多了,自然對各種方法也就熟能生巧了,面試的時候,再遇到此類問題,也就能夠收放自如了。當然,千萬不要相信有著張無忌般的運氣,能夠在一夜之間練成乾坤大挪移這一絕世神功,稱霸武林,演算法設計功力的練就靠得是平時一點一滴的付出和思維的磨練。方法與技巧也許只是給面試打了一針“雞血”、喂一口大補丸,讓自己變得從容自信,真正的內力還是一個長期的積累過程,不是速食產品能夠比得了的。

相關推薦

《PHP程式設計師面試筆試》——如何回答演算法設計問題?

  如何巧妙地回答面試官的問題?   本文摘自《PHP程式設計師面試筆試寶典》   程式設計師面試中的很多演算法設計問題,都是歷年來各家企業的“炒現飯”,不管求職者以前對演算法知識掌握得是否紮實,理解得是否深入,只要面試前買本《程式設計師面試筆試寶典》,應付此類題目完全

《Java程式設計師面試筆試Static關鍵字有哪些作用

static關鍵字主要有兩種作用:第一,只想為某特定資料型別或物件分配單一的儲存空間,而與建立物件的個數無關。第二,希望某個方法或屬性與類而不是物件關聯在一起,也就是說,在不建立物件的情況下就可以通過類來直接呼叫方法或使用類的屬性。具體而言,static在Java語言中主要有

《PHP程式設計師面試筆試》——如何回答快速估算類問題?

如何巧妙地回答面試官的問題? 本文摘自《PHP程式設計師面試筆試寶典》 有些大企業的面試官,總喜歡出一些快速估算類問題,對他們而言,這些問題只是手段,不是目的,能夠得到一個滿意的結果固然是他們所需要的,但更重要的是通過這些題目可以考查求職者的快速反應能力以及邏輯思維能力。由於求職者平時準備的時候可能對此類

《PHP程式設計師面試筆試》——如何回答非技術性問題?

如何巧妙地回答面試官的問題? 本文摘自《PHP程式設計師面試筆試寶典》 評價一個人的能力,除了專業能力,還有一些非專業能力,如智力、溝通能力和反應能力等,所以在IT企業招聘過程的筆試、面試環節中,並非所有的內容都是C/C++/Java、資料結構與演算法及作業系統等專業知識,也包括其他一些非技術類的知識,如

《PHP程式設計師面試筆試》——如何回答技術性的問題?

如何巧妙地回答面試官的問題? 本文摘自《PHP程式設計師面試筆試寶典》 程式設計師面試中,面試官會經常詢問一些技術性的問題,有的問題可能比較簡單,都是歷年的面試、筆試真題,求職者在平時的複習中會經常遇到。但有的題目可能比較難,來源於Google、Microsoft等大企業的題庫或是企業自己為了招聘需要設計

《Java程式面試筆試volatile有什麼作用

在由Java語言編寫的程式中。有時候為了提高程式的執行效率,編譯器會自己主動對其進行優化,把經常被訪問的變數快取起來,程式在讀取這個變數的時候有可能會直接從快取(比如暫存器)中來讀取這個值。而不會去記憶體中讀取。這樣做的一個優點是提高了程式的執行效率,但當遇到多執行緒程式設

程式設計師求職程式設計師面試筆試如何回答演算法設計問題?

程式設計師面試中,很多演算法設計問題,都是歷年來各家企業的“炒現飯”,不管求職者以前對演算法知識學習得是否紮實,理解得是否深入,只要面試前買本《程式設計師面試筆試寶典》(備註:編者早前編寫的一本書,機械工業出版社出版),學習上一段時間,牢記於心,應付此類題目完全沒有問題,但遺

程式設計師求職程式設計師面試筆試快樂程式設計的好習慣有哪些?

這一點錯,那一點錯,錯到一起就是大錯。——《我是特種兵之利刃出鞘》程式設計是一項聰明人玩的遊戲,它既是對智力的考驗,也是對習慣的考驗,智力的好壞取決於父母的基因,人們無從左右,但習慣的好壞卻是可以不斷培養。一項由美國芝加哥大學國家研究組織進行的綜合社會調查,公佈了“十大最痛苦

《PHP程式設計師面試筆試》——如何巧妙地回答面試官的問題?

如何巧妙地回答面試官的問題? 本文摘自《PHP程式設計師面試筆試寶典》 所謂“來者不善,善者不來”,程式設計師面試中,求職者不可避免地需要回答面試官各種“刁鑽”、犀利的問題,回答面試官的問題千萬不能簡單地回答“是”或者“不是”,而應該具體分析“是”或者“不是”的理由。 回答面試官的問題是一門很深的學問。

《PHP程式設計師面試筆試》——如何應對面試官的“激將法”語言?

如何巧妙地回答面試官的問題? 本文摘自《PHP程式設計師面試筆試寶典》 “激將法”是面試官用以淘汰求職者的一種慣用方法,它是指面試官採用懷疑、尖銳或咄咄逼人的交流方式來對求職者進行提問的方法。例如,“我覺得你比較缺乏工作經驗”“我們需要活潑開朗的人,你恐怕不合適”“你的教育背景與我們的需求不太適合”“你的

《PHP程式設計師面試筆試》——如何應對自己不會回答的問題?

如何巧妙地回答面試官的問題? 本文摘自《PHP程式設計師面試筆試寶典》 在面試的過程中,對面試官提出的問題求職者並不是都能回答出來,計算機技術博大精深,很少有人能對計算機技術的各個分支學科瞭如指掌。而且拋開技術層面的問題,在面試那種緊張的環境中,回答不上來的情況也容易出現。面試過程中遇到自己不會回答的問題

《PHP程式設計師面試筆試》——什麼是職場暗語?

本文摘自《PHP程式設計師面試筆試寶典》 文末有該書電子版下載。 隨著求職大勢的變遷發展,以往常規的面試套路因為過於單調、簡明,已經被眾多“面試達人”們挖掘出了各種“破解祕訣”,形成了類似“求職寶典”的各類“面經”。面試官們也紛紛升級面試模式,為求職者們製作了更為隱蔽、間接、含混的面試題目,讓那些早已流傳

《PHP程式設計師面試筆試》——在被企業拒絕後是否可以再申請?

如何巧妙地回答面試官的問題? 本文摘自《PHP程式設計師面試筆試寶典》 很多企業為了能夠在一年一度的招聘季節中,提前將優秀的程式設計師鎖定到自己的麾下,往往會先下手為強。他們通常採取的措施有兩種:一是招聘實習生;二是多輪招聘。很多人可能會擔心,萬一面試時發揮不好,沒被企業選中,會不會被企業接入黑名單,從此

《PHP程式設計師面試筆試》——如果面試問題曾經遇見過,是否要告知面試官?

如何巧妙地回答面試官的問題? 本文摘自《PHP程式設計師面試筆試寶典》 面試中,大多數題目都不是憑空想象出來的,而是有章可循,只要求職者肯花時間,耐得住寂寞,複習得當,基本上在面試前都會見過相同的或者類似的問題(當然,很多知名企業每年都會推陳出新,這些題目是很難完全複習到位的)。所以,在面試中,求職者曾經

我的新書——《PHP程式設計師面試筆試

你好,是我琉憶。 一個文藝的PHP開發工程師。 很榮幸能夠在這裡帶來我的第一本新書——《PHP程式設計師面試筆試寶典》。 一、創作過程 《PHP程式設計師面試筆試寶典》是我的第一本書,從寫作到出來總共經歷了一整年的時間。它就像我的孩子一樣,十分的努力去創作,也十分的愛惜,創作實際用了

Java程式設計師面試筆試

網站 更多書籍點選進入>> CiCi島 下載 電子版僅供預覽及學習交流使用,下載後請24小時內刪除,支援正版,喜歡的請購買正版書籍 電子書下載(皮皮雲盤-點選“普通下載”) 購買正版 封頁 編輯推薦 ★在這裡,眾多知名企業面試

贈送 4 本《 PHP 程式設計師面試筆試

《 PHP 程式設計師面試筆試寶典》歷時一年,由機械工業出版社出版,在 2018 年 11 月問世。全書共八個章節,涉及 面試筆試經驗技巧、PHP 基礎知識、PHP 進階知識,PHP 面向物件、PHP 設計模式、mysql 的優化進階知識等,根據最近 3 年常考的 PHP 面試真題彙集成的 PHP 面試知識點

Java程式設計師面試筆試刷題總結~16

    雖然申請部落格已經有一段時間了,卻是第一次寫部落格,有點激動,不知道該寫些什麼,剛好大三老學姐正值找實習工作之際,每天都會刷一點題,現在在看Java程式設計師面試筆試寶典一書,剛好把裡面的題每天總結5道,寫在部落格裡,一來自我督促,保持每天都會刷題,二來自我加深印象,

Java基礎知識《Java程式設計師面試筆試》--關鍵字

一、break 和 goto        1、Java如何跳出多重迴圈:在多重迴圈外面加標誌public class Break{     public static void main(String[] args){         out:         for(in

Java基礎知識《Java程式設計師面試筆試》--基本型別與運算

一、Java的八種資料型別    1、八種基本資料型別為:int、short、byte、long、char、float、double、boolean(String不是基本資料型別);    2、int 4位元組,取值範圍約為 負21億4千7百萬 到 21億4千7百萬    3