1. 程式人生 > >常見的80道面試演算法題

常見的80道面試演算法題

由於這些題,實在太火了。所以,應廣大網友建議要求,在此把之前已整理公佈的前80題, 現在,一次性分享出來。此也算是前80題第一次集體亮相。 此些題,已有上萬人,看到或見識到,若私自據為己有,必定為有知之人識破,付出代價。 所以,作者宣告: 本人July對以上所有任何內容和資料享有版權,轉載請註明作者本人July出處。 向你的厚道致敬。謝謝。 ---------------------------------------------------------------------------------------------------------------- 1.把二元查詢樹轉變成排序的雙向連結串列  題目: 輸入一棵二元查詢樹,將該二元查詢樹轉換成一個排序的雙向連結串列。 要求不能建立任何新的結點,只調整指標的指向。    10  / \  6 14  / \ / \ 4 8 12 16  轉換成雙向連結串列 4=6=8=10=12=14=16。  首先我們定義的二元查詢樹 節點的資料結構如下:  struct BSTreeNode {  int m_nValue; // value of node  BSTreeNode *m_pLeft; // left child of node  BSTreeNode *m_pRight; // right child of node }; 2.設計包含min函式的棧。 定義棧的資料結構,要求新增一個min函式,能夠得到棧的最小元素。 要求函式min、push以及pop的時間複雜度都是O(1)。 3.求子陣列的最大和 題目: 輸入一個整形陣列,數組裡有正數也有負數。 陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。 求所有子陣列的和的最大值。要求時間複雜度為O(n)。 例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4, 7, 2, 因此輸出為該子陣列的和18。 4.在二元樹中找出和為某一值的所有路徑 題目:輸入一個整數和一棵二元樹。 從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。 打印出和與輸入整數相等的所有路徑。 例如 輸入整數22和如下二元樹  10   / \    5 12    /   \   4     7 則打印出兩條路徑:10, 12和10, 5, 7。 二元樹節點的資料結構定義為: struct BinaryTreeNode // a node in the binary tree { int m_nValue; // value of node BinaryTreeNode *m_pLeft; // left child of node BinaryTreeNode *m_pRight; // right child of node }; 5.查詢最小的k個元素 題目:輸入n個整數,輸出其中最小的k個。 例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。 第6題 騰訊面試題: 給你10分鐘時間,根據上排給出十個數,在其下排填出對應的十個數 要求下排每個數都是先前上排那十個數在下排出現的次數。 上排的十個數如下: 【0,1,2,3,4,5,6,7,8,9】 舉一個例子, 數值: 0,1,2,3,4,5,6,7,8,9 分配: 6,2,1,0,0,0,1,0,0,0 0在下排出現了6次,1在下排出現了2次, 2在下排出現了1次,3在下排出現了0次.... 以此類推.. 第7題 微軟亞院之程式設計判斷倆個連結串列是否相交 給出倆個單向連結串列的頭指標,比如h1,h2,判斷這倆個連結串列是否相交。 為了簡化問題,我們假設倆個連結串列均不帶環。 問題擴充套件: 1.如果連結串列可能有環列? 2.如果需要求出倆個連結串列相交的第一個節點列? 第8題 此貼選一些 比較怪的題,,由於其中題目本身與演算法關係不大,僅考考思維。特此並作一題。 1.有兩個房間,一間房裡有三盞燈,另一間房有控制著三盞燈的三個開關, 這兩個房間是 分割開的,從一間裡不能看到另一間的情況。 現在要求受訓者分別進這兩房間一次,然後判斷出這三盞燈分別是由哪個開關控制的。 有什麼辦法呢? 2.你讓一些人為你工作了七天,你要用一根金條作為報酬。金條被分成七小塊,每天給出一塊。 如果你只能將金條切割兩次,你怎樣分給這些工人? 3. ★用一種演算法來顛倒一個連結表的順序。現在在不用遞迴式的情況下做一遍。   ★用一種演算法在一個迴圈的連結表裡插入一個節點,但不得穿越連結表。   ★用一種演算法整理一個數組。你為什麼選擇這種方法?   ★用一種演算法使通用字串相匹配。   ★顛倒一個字串。優化速度。優化空間。   ★顛倒一個句子中的詞的順序,比如將“我叫克麗絲”轉換為“克麗絲叫我”, 實現速度最快,移動最少。   ★找到一個子字串。優化速度。優化空間。   ★比較兩個字串,用O(n)時間和恆量空間。    ★假設你有一個用1001個整陣列成的陣列,這些整數是任意排列的,但是你知道所有的整數都在1到1000(包括1000)之間。此外,除一個數字出現 兩次外,其他所有數字只出現一次。假設你只能對這個陣列做一次處理,用一種演算法找出重複的那個數字。如果你在運算中使用了輔助的儲存方式,那麼你能找到不 用這種方式的演算法嗎?   ★不用乘法或加法增加8倍。現在用同樣的方法增加7倍。 第9題 判斷整數序列是不是二元查詢樹的後序遍歷結果 題目:輸入一個整數陣列,判斷該陣列是不是某二元查詢樹的後序遍歷的結果。 如果是返回true,否則返回false。 例如輸入5、7、6、9、11、10、8,由於這一整數序列是如下樹的後序遍歷結果:          8       / \      6    10     / \ / \    5 7 9 11 因此返回true。 如果輸入7、4、6、5,沒有哪棵樹的後序遍歷的結果是這個序列,因此返回false。 第10題 翻轉句子中單詞的順序。 題目:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。 句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。 例如輸入“I am a student.”,則輸出“student. a am I”。 第11題 求二叉樹中節點的最大距離... 如果我們把二叉樹看成一個圖,父子節點之間的連線看成是雙向的, 我們姑且定義"距離"為兩節點之間邊的個數。 寫一個程式, 求一棵二叉樹中相距最遠的兩個節點之間的距離。 第12題 題目:求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case等關鍵字以及條件判斷語句(A?B:C)。 第13題: 題目:輸入一個單向連結串列,輸出該連結串列中倒數第k個結點。連結串列的倒數第0個結點為連結串列的尾指標。 連結串列結點定義如下:  struct ListNode {  int m_nKey;  ListNode* m_pNext; }; 第14題: 題目:輸入一個已經按升序排序過的陣列和一個數字, 在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。 要求時間複雜度是O(n)。如果有多對數字的和等於輸入的數字,輸出任意一對即可。 例如輸入陣列1、2、4、7、11、15和數字15。由於4+11=15,因此輸出4和11。 第15題: 題目:輸入一顆二元查詢樹,將該樹轉換為它的映象, 即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。 用遞迴和迴圈兩種方法完成樹的映象轉換。  例如輸入:  8  / \  6 10  /\ /\ 5 7 9 11 輸出:  8  / \  10 6  /\ /\ 11 9 7 5 定義二元查詢樹的結點為: struct BSTreeNode // a node in the binary search tree (BST) {  int m_nValue; // value of node  BSTreeNode *m_pLeft; // left child of node  BSTreeNode *m_pRight; // right child of node }; 第16題: 題目(微軟): 輸入一顆二元樹,從上往下按層列印樹的每個結點,同一層中按照從左往右的順序列印。  例如輸入  8  / \  6 10 / \ / \ 5 7 9 11 輸出8 6 10 5 7 9 11。 第17題: 題目:在一個字串中找到第一個只出現一次的字元。如輸入abaccdeff,則輸出b。  分析:這道題是2006年google的一道筆試題。 第18題: 題目:n個數字(0,1,…,n-1)形成一個圓圈,從數字0開始, 每次從這個圓圈中刪除第m個數字(第一個為當前數字本身,第二個為當前數字的下一個數字)。 當一個數字刪除後,從被刪除數字的下一個繼續刪除第m個數字。 求出在這個圓圈中剩下的最後一個數字。 July:我想,這個題目,不少人已經 見識過了。 第19題: 題目:定義Fibonacci數列如下:   / 0 n=0 f(n)= 1 n=1  \ f(n-1)+f(n-2) n=2 輸入n,用最快的方法求該數列的第n項。 分析:在很多C語言教科書中講到遞迴函式的時候,都會用Fibonacci作為例子。 因此很多程式設計師對這道題的遞迴解法非常熟悉,但....呵呵,你知道的。。 第20題: 題目:輸入一個表示整數的字串,把該字串轉換成整數並輸出。 例如輸入字串"345",則輸出整數345。 第21題 2010年中興面試題 程式設計求解: 輸入兩個整數 n 和 m,從數列1,2,3.......n 中 隨意取幾個數, 使其和等於 m ,要求將其中所有的可能組合列出來. 第22題: 有4張紅色的牌和4張藍色的牌,主持人先拿任意兩張,再分別在A、B、C三人額頭上貼任意兩張牌, A、B、C三人都可以看見其餘兩人額頭上的牌,看完後讓他們猜自己額頭上是什麼顏色的牌, A說不知道,B說不知道,C說不知道,然後A說知道了。 請教如何推理,A是怎麼知道的。 如果用程式,又怎麼實現呢? 第23題: 用最簡單,最快速的方法計算出下面這個圓形是否和正方形相交。"  3D座標系 原點(0.0,0.0,0.0) 圓形: 半徑r = 3.0 圓心o = (*.*, 0.0, *.*) 正方形: 4個角座標;  1:(*.*, 0.0, *.*) 2:(*.*, 0.0, *.*) 3:(*.*, 0.0, *.*) 4:(*.*, 0.0, *.*) 第24題: 連結串列操作, (1).單鏈表就地逆置, (2)合併連結串列 第25題: 寫一個函式,它的原形是int continumax(char *outputstr,char *intputstr) 功能: 在字串中找出連續最長的數字串,並把這個串的長度返回, 並把這個最長數字串付給其中一個函式引數outputstr所指記憶體。 例如:"abcd12345ed125ss123456789"的首地址傳給intputstr後,函式將返回9, outputstr所指的值為123456789 26.左旋轉字串 題目: 定義字串的左旋轉操作:把字串前面的若干個字元移動到字串的尾部。 如把字串abcdef左旋轉2位得到字串cdefab。請實現字串左旋轉的函式。 要求時間對長度為n的字串操作的複雜度為O(n),輔助記憶體為O(1)。 27.跳臺階問題 題目:一個臺階總共有n級,如果一次可以跳1級,也可以跳2級。 求總共有多少總跳法,並分析演算法的時間複雜度。 這道題最近經常出現,包括MicroStrategy等比較重視演算法的公司 都曾先後選用過個這道題作為面試題或者筆試題。 28.整數的二進位制表示中1的個數 題目:輸入一個整數,求該整數的二進位制表達中有多少個1。 例如輸入10,由於其二進位制表示為1010,有兩個1,因此輸出2。 分析: 這是一道很基本的考查位運算的面試題。 包括微軟在內的很多公司都曾採用過這道題。 29.棧的push、pop序列 題目:輸入兩個整數序列。其中一個序列表示棧的push順序, 判斷另一個序列有沒有可能是對應的pop順序。 為了簡單起見,我們假設push序列的任意兩個整數都是不相等的。  比如輸入的push序列是1、2、3、4、5,那麼4、5、3、2、1就有可能是一個pop系列。 因為可以有如下的push和pop序列: push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop, 這樣得到的pop序列就是4、5、3、2、1。 但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。 30.在從1到n的正數中1出現的次數 題目:輸入一個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。 例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。 分析:這是一道廣為流傳的google面試題。 31.華為面試題: 一類似於蜂窩的結構的圖,進行搜尋最短路徑(要求5分鐘) 32. 有兩個序列a,b,大小都為n,序列元素的值任意整數,無序; 要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。 例如:  var a=[100,99,98,1,2, 3]; var b=[1, 2, 3, 4,5,40]; 33. 實現一個挺高階的字元匹配演算法: 給一串很長字串,要求找到符合要求的字串,例如目的串:123 1******3***2 ,12*****3這些都要找出來 其實就是類似一些和諧系統。。。。。 34. 實現一個佇列。 佇列的應用場景為: 一個生產者執行緒將int型別的數入列,一個消費者執行緒將int型別的數出列 35. 求一個矩陣中最大的二維矩陣(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是: 4 5 5 3 要求:(1)寫出演算法;(2)分析時間複雜度;(3)用C寫出關鍵程式碼 第36題-40題(有些題目蒐集於CSDN上的網友,已標明): 36.引用自網友:longzuo 谷歌筆試: n支隊伍比賽,分別編號為0,1,2。。。。n-1,已知它們之間的實力對比關係, 儲存在一個二維陣列w[n][n]中,w[i][j] 的值代表編號為i,j的隊伍中更強的一支。 所以w[i][j]=i 或者j,現在給出它們的出場順序,並存儲在陣列order[n]中, 比如order[n] = {4,3,5,8,1......},那麼第一輪比賽就是 4對3, 5對8。....... 勝者晉級,敗者淘汰,同一輪淘汰的所有隊伍排名不再細分,即可以隨便排, 下一輪由上一輪的勝者按照順序,再依次兩兩比,比如可能是4對5,直至出現第一名 程式設計實現,給出二維陣列w,一維陣列order 和 用於輸出比賽名次的陣列result[n], 求出result。 37. 有n個長為m+1的字串, 如果某個字串的最後m個字元與某個字串的前m個字元匹配,則兩個字串可以聯接, 問這n個字串最多可以連成一個多長的字串,如果出現迴圈,則返回錯誤。 38. 百度面試: 1.用天平(只能比較,不能稱重)從一堆小球中找出其中唯一一個較輕的,使用x次天平, 最多可以從y個小球中找出較輕的那個,求y與x的關係式。 2.有一個很大很大的輸入流,大到沒有儲存器可以將其儲存下來, 而且只輸入一次,如何從這個輸入流中隨機取得m個記錄。 3.大量的URL字串,如何從中去除重複的,優化時間空間複雜度 39. 網易有道筆試: (1). 求一個二叉樹中任意兩個節點間的最大距離, 兩個節點的距離的定義是 這兩個節點間邊的個數, 比如某個孩子節點和父節點間的距離是1,和相鄰兄弟節點間的距離是2,優化時間空間複雜度。 (2). 求一個有向連通圖的割點,割點的定義是,如果除去此節點和與其相關的邊, 有向圖不再連通,描述演算法。 40.百度研發筆試題 引用自:zp155334877 1)設計一個棧結構,滿足一下條件:min,push,pop操作的時間複雜度為O(1)。 2)一串首尾相連的珠子(m個),有N種顏色(N<=10), 設計一個演算法,取出其中一段,要求包含所有N中顏色,並使長度最短。 並分析時間複雜度與空間複雜度。 3)設計一個系統處理詞語搭配問題,比如說 中國 和人民可以搭配, 則中國人民 人民中國都有效。要求:  *系統每秒的查詢數量可能上千次;  *詞語的數量級為10W;  *每個詞至多可以與1W個詞搭配 當用戶輸入中國人民的時候,要求返回與這個搭配片語相關的資訊。

相關推薦

常見80面試演算法

由於這些題,實在太火了。所以,應廣大網友建議要求,在此把之前已整理公佈的前80題, 現在,一次性分享出來。此也算是前80題第一次集體亮相。 此些題,已有上萬人,看到或見識到,若私自據為己有,必定為有知之人識破,付出代價。 所以,作者宣告: 本人July對

淚奔!學了1年java的程式設計師面試,掛在了這基礎演算法

  這都是java的演算法題,應該來講都是些比較簡單的演算法題,但是我敢說很多基礎的學習的,或者想去面試的人都會不能完整的寫出來,現在java學習,大多數人都不是非常紮實,對於基礎也不是很重視的,所以就發出來給大家參考鞏固下基礎! 這篇文章分享之前我還是要推薦下我自己

面試現場簡單幾java演算法, 你能寫出幾?

這兩天小編逛論壇的時候發現一個很有意思的事情,就是一位網際網路公司的面試官分享的,他們最近想招一批java的實習生,所以他們的面試題並不難,但是前來面試的人,卻很多都掛在了幾道演算法題上,要麼就是邏輯不嚴謹,要麼就是題目都看不懂的,還有就是書寫錯誤的,這讓他感到很詫異,畢竟演算法其實對於程式設計師來

java 演算法 - 面試常見的位操作演算法

前言 上一篇部落格 聊一聊 Android 中巧妙的位操作 中,我們講解了 java 中常用的位運算及常用應用場景,今天,讓我們一起來看一下,面試中常見的位操作的演算法題。 兩個只出現一次的數字 【題目描述】一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。請寫程

面試演算法——數字刪除指定個數使結果

給定一個正整數,如果刪除其中若干數字,怎麼刪除能保證剩下的數字組成最大,程式設計實現,不長於O(n),輸入給定的正整數和要刪除的數字個數 5349 2  ==》 59 思路:          先求這個數字的遞減序列,然後刪除遞

面試演算法總結

1.使用遞迴方法求陣列和 當時聽到這個問題一臉懵逼,因為我們平時求陣列和都是直接迴圈去計算的,突然要求用遞迴算,表示當時一點思路也沒有,也可能還是因為對遞迴演算法不太熟吧,總之當時著實尷尬,後來想想,

校招準備系列9-筆試面試演算法

筆試演算法題 可以先對一些簡單情形進行手工模擬,查詢規律 有時先對陣列進行排序可以使運算變得簡單,提高效率 字串問題、括號匹配問題,可以考慮逆向思維,從右往左看 從初態到某一狀態A最少需要幾步?可以考慮從狀態A回到初態的逆過程需要幾步 括號匹配,標準匹配正負之和

淺析經典面試演算法-two pointer的運用

前幾天和朋友討論 Google 電面的一道題, 由此啟發, 總結了下 two pointer 的使用場景, 在大部分情況下, 恰當地使用 two pointer 可以使時間複雜度保持在 O(n), 像 online judge 裡部分 medium 題經常提及的子數列型別

15簡單演算法

最近在公司裡基本處於打醬油的狀態,工作正在交接中。沒事又做起了演算法題目。好久沒怎麼寫演算法題了,感覺手氣還不錯,經常能一次就寫對(編譯通過,得到想要的結果,沒怎麼測試),可能是因為這些題目之前看過或是寫過,或許就是自己進步了一點。這15道大部分來自《劍指Offer》,作者的部落格之前看過幾次,感覺寫得很好,

面試演算法:求a+aa+aaa+aaaa+aa...a的值

題目 求s=a+aa+aaa+aaaa+aa…a的值,數字個數為n,其中a是一個數字。例如2+22+222+2222+22222(此時n=5) 思路 由於aa…a是一個整數,這樣基本排除要考慮越界問題,所以不用往大數方向考慮。 個位

面試演算法(2)--兩個大數相加

兩個大數相加聽說這是個頻繁出現的演算法題,在某某網站是的排行很靠前。在找工作之前,同事提過一次,我沒當回事,恰恰在我第一家面試時就碰到了。兩個大數相加。1、是整數;2、兩個數無限大,long都裝不下;3、不能用BigInteger;4、不能用任何包裝類提供的運算方法;5、兩個

一道有意思的面試演算法

新年第一篇文章,先祝大家新年快樂!!那麼接下來進入正文。 前言 前陣子突發奇想,突然開始刷leetcode。其中刷到了一道有意思的題目,發現這道題是當時秋招的時候,騰訊面試官曾經問過我的題目。於是分享給大家看下。 題目描述 給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出

2019校招-美團-後臺開發工程師面試演算法

美團後臺開發工程師 演算法題 已知有陣列a[]={0,1,0,3,0,12}; 實現將陣列中的0全部移到陣列的最後,並保證其他元素是排序的 ,即輸出為a[]={1,3,12,0,0,

面試演算法:爬樓梯,N級樓梯有多少種走法?

By Long Luo 最近去面試時,在一家小公司面試時,公司小BOSS給我出了一道演算法題: 一個人爬樓梯,一步可以邁一級,二級,三級臺階,如果樓梯有N級,要求編寫程式,求總共有多少種走法。 這個問題應該是一個很老的題目了,用中學數學來說,就是一個

Java工程師面試---面試演算法(一)

一、階乘問題: 階乘結果包含零的個數: 首先想到零是怎麼出現的10的倍數相乘即可,即 (5*2)*n n為任意的數。 1、2 只要是偶數 都包含2.而包括5的只存在位數為0或者5的數裡面 2、所有2的個數 遠遠多於5的個數,故只要統計五的個數 3、每

Python的100經典演算法(1)

按照c語言的100道經典演算法題,自己原創寫的,就得是自己的練習題了 【程式1】 題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少? 程式分析:可填在百位、十位、個

C++經典面試演算法

#include <assert.h> #include <string.h> #include <stack> /////////////////////////////////////////////////////////////

leetcode:Minimum Depth of Binary Tree(樹的根節點到葉子節點的最小距離)【面試演算法

題目: Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest path from the root node d

leetcode:N-Queens (n皇后問題) 【面試演算法

題目:The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other. Given an

幾個面試演算法,附原始碼

昨天下午面試了一家,最後有道演算法題,當時沒想起來,就拍了張照,回來慢慢想,也算沒白去。原題 :  有N個人圍成一圈,順序排號。從第一個人開始報數(1到3),凡是報到3的人推出圈子,問最後留下的是原來第幾號的那位?先說下當時的思路,當時以為留下的人是有規律的,就想用數學歸納法