互聯網公司最常見的面試演算法題有哪些?


常考面試演算法題類型總結

結合2017春招和秋招真題,以下幾類演算法題最常考,匯總了一下:

一、暴力枚舉

好多魚!

DNA合成

連續整數

序列和

01翻轉

最長公共連續子串

組裝三角形

最小的矩形

字元串分類

優美的迴文串

趕去公司

調整隊形

集合

塗棋盤

小易記單詞

分餅乾

買帽子

度度熊回家

尋找三角形

有趣的排序

神奇數

添加字元

數組變換

二、動態規劃

頁碼統計

創造新世界

雙核處理

堆磚塊

不等式數列

牛牛的數列

暗黑的字元串

數字和為sum的方法數

三、DFS/BFS

推箱子

工作安排

幸運的袋子

飢餓的小易

跳石板

地下迷宮

四、數學

超級素數冪

找整除

魔力手環

混合顏料

最大的奇約數

末尾0的個數

五、模擬實現

平衡數

消除重複元素

奇怪的表達式求值

變換次數

六、貪心演算法

排序子序列

組隊競賽

訓練部隊

七、字元串演算法

循環單詞

練習題庫推薦

推薦兩個題庫,面試演算法題基本上都是從裡面出的或者變形而來:

1、劍指Offer

2、leetcode在線編程

演算法視頻推薦

1、直通BAT:面試演算法精講課

2、牛課堂演算法精講直播講座(2017)

互聯網名企面經精選

因為每家公司的側重點不同,所以他們面試時考的題目類型也不同。如果能提前知道每家公司考題的風格,臨到自己上考場就會輕鬆很多。整理了一些前輩們的面試經驗分享給大家:

阿里巴巴:

成都螞蟻金服三次面試面經

阿里安卓一面_筆經面經

阿里前端一面_筆經面經

螞蟻金服內推一面_筆經面經

7月18螞蟻金服後台開發崗位 55分鐘

阿里巴巴-螞蟻金服-數據研發崗(一面)

華為:

【山東地區華為優招面試】紀念我的首面

阿里、百度、騰訊、華為面經(均已拿到offer)

【面經】技術面+綜合面【華為內推】【IT應用軟體開發】

華為優招面經-乾貨

好未來:

[面經] 好未來 iOS實習生面經

好未來-php實習面經

好未來(已拿offer)+ CVTE(3面通過)

網易:

網易+阿里內推面經

網易互聯網Java內推面試經驗-19號

網易雷火線下筆試

網易內推測試崗面經

網易測試二面

京東:

2017年校招【京東面經】 哈爾濱站

京東Java研發(1面+2面)

京東校招一面

JD(北京)複試

騰訊:

騰訊一面,攢人品!

騰訊二面三面、百度二面三面面經

阿里、百度、騰訊、華為面經(均已拿到offer)

百度:

北京百度C++一面二面經驗

騰訊二面三面、百度二面三面面經

百度 北京 機器學習/數據挖掘 提前批

百度網頁搜索部三次面試面經

百度運維電話面一面面經

美團:

南京美團面試--機器學習崗

新鮮的美團面經,機器學習崗

滴滴,美團點評,騰訊一面面經

美團面經(面的晚...發的晚)

更多面經匯總

1、備戰秋招,17年春招面經整理合集(170篇) - 知乎專欄

2、23家互聯網名企的300多篇精華筆經面經,免費領取 - 知乎專欄

最後,祝大家都能拿到自己最想要的那份offer,加油~


從程序員面試角度來說,經典的問題包括以下內容:

演算法部分

二分搜索 Binary Search
分治 Divide Conquer
寬度優先搜索 Breadth First Search
深度優先搜索 Depth First Search
回溯法 Backtracking
雙指針 Two Pointers
動態規劃 Dynamic Programming
掃描線 Scan-line algorithm
快排 Quick Sort

數據結構部分

棧 Stack
隊列 Queue
鏈表 Linked List
數組 Array
哈希表 Hash Table
二叉樹 Binary Tree
堆 Heap
並查集 Union Find
字典樹 Trie

根據2017年校招的情況,我整理了2017校招的常考演算法類型,以及對應的典型題目。

另附參考答案地址:LINTCODE / LEETCODE 參考答案查詢

數學

尾部的零
斐波納契數列
x的平方根
x的平方根 2
大整數乘法
骰子求和
最多有多少個點在一條直線上
超級丑數

比特位操作

將整數A轉換為B更新二進位位
二進位表示
O(1)時間檢測2的冪次
二進位中有多少個1

動態規劃

編輯距離正則表達式匹配
交叉字元串
乘積最大子序列
二叉樹中的最大路徑和
不同的路徑
通配符匹配

滑動窗口的中位數數據流中位數
最高頻的K個單詞
接雨水
堆化
排序矩陣中的從小到大第k個數

二叉樹

二叉樹中序遍歷二叉樹的序列化和反序列化
子樹
最近公共祖先
二叉樹的層次遍歷
將二叉樹拆成鏈表
在二叉查找樹中插入節點

二分法

經典二分查找問題二分查找
兩數組的交
區間最小數
尋找旋轉排序數組中的最小值
搜索排序區間
尋找峰值

分治法

快速冪兩個排序數組的中位數
合併K個排序鏈表

哈希表

變形詞子串哈希函數
短網址
複製帶隨機指針的鏈表
最小子串覆蓋

矩陣

搜索二維矩陣旋轉圖像
島嶼的個數
螺旋矩陣

寬度優先搜索

克隆圖被圍繞的區域
拓撲排序
單詞接龍

鏈表

實現一個鏈表的反轉鏈表求和 II
刪除鏈表中的元素
LRU緩存策略
合併兩個排序鏈表
兩個鏈表的交叉
翻轉鏈表 II
複製帶隨機指針的鏈表
帶環鏈表

枚舉法

統計數字名人確認
最長連續上升子序列
最大子數組差
最長公共前綴

排序

快排擺動排序
最大間距
最接近零的子數組和
最大數
四數之和
數組劃分
第K大元素
排顏色

深度優先搜索

N皇后問題圖是否是樹
帶重複元素的排列
分割迴文串

數組

數組劃分逆序對
合併區間
搜索旋轉排序數組
最大子數組
刪除排序數組中的重複數字
第二大的數組
先遞增後遞減數組中的最大值
兩數和 - 輸入的數據是有序的
兩個排序數組的中位數
在大數組中查找
顏色分類
合併排序數組
無序數組K小元素
中位數
奇偶分割數組

貪心

主元素尋找缺失的數
買賣股票最佳時機
加油站
刪除數字
落單的數
最大子數組差

線段樹

線段樹查詢線段樹的構造
線段樹的修改
區間求和
統計比給定整數小的數的個數

帶最小值操作的棧用棧實現隊列
有效的括弧序列
簡化路徑

整數

反轉整數將整數A轉換為B
整數排序

字元串處理

羅馬數字轉整數迴文數
亂序字元串
有效迴文串
翻轉字元串
最長無重複字元的子串
字元串壓縮
比較字元串編輯距離II

歡迎關注我的微信公眾號:九章演算法(ninechapter),幫助你了解IT技術前沿,通過面試、拿到offer、找到好工作!


說一說我在Airbnb當面試官的經驗

先說個結論:演算法是其次,主要是寫碼能力與熟練度


Airbnb一般的coding面試的流程是45分鐘,10~15分鐘白板分析下問題,25~30分鐘上機實現演算法,5分鐘留給面試者問問題

時間的限制決定了題不可能太難,基本不會超過leetcode難度。而且Airbnb作為還算是創業公司,更看重的是快速落實一個想法的能力。 一些常用的演算法(什麼拓撲排序啊,回溯,最小生成樹這些,都是很基本的)你忘了也沒關係,我們可以一起在白板上推。稍微有點實力的面試者白板出一個solution是沒有問題的,所以這個時候就主要看寫碼能力與熟練度了。

上機寫碼考察的方面很多,比如面試者

  • 語言的熟練程度 語言不重要,但你總得對你拿來面試的語言很熟吧。我們會先問你prefer什麼語言,然後選這個語言熟的面試官來。
  • 落實設計的能力 最怕吹半天,寫一行代碼都困難的那種人。
  • 對電腦的熟悉程度 這個不是必須,但熟練使用快捷鍵、shell之類的總是加分項

灣區據我所知有越來越多的公司是採用上機寫碼或者pair programming的這種形式。(Square是純pair programming。Uber是只白板,所以uber印度人多)

我見過很多面試者,名校畢業簡歷上project一大堆,結果第一步implement一個圖都扭扭捏捏半天搞不出來,估計在project裡面也就醬油為輔混資歷為主。還有Amazon資深工程師,在eclipse裡面寫java,每一行不寫完,讓IDE自動改錯,還都是拿滑鼠去點,結果愣是沒寫完。


樓主的問題比較籠統,所以要完全的回答不是很容易
本人在美國10年,FLAG公司,以及各大科技巨頭面試也見過很多次,可以大概的分享下我的經驗

首先需要明白的是:應屆畢業生和在職跳槽,面試難度上,應屆畢業生的難度,以及打分的要求,會略低於在職跳槽,原因很簡單,應屆畢業生經驗不足,沒有全職的工作經歷。

至於灣區FLAG和各大公司巨頭的面試流程,時間線,不是本問題的中心,如果需要的話,可以私信我。

首先,作為程序員,你必須知道Leetcode這個OJ,刷題題庫,必備
題目分為easy, medium, hard等級,沒有聽說過的朋友可以先去看看。

現在講講面試的題目

Facebook,面試難度9分
考察的知識點很全面,Facebook的面試題目難度一般都在medium偏上一點,但為什麼我打難度9分,因為Facebook的面試要求很高,簡單的說,面試者必須在最快的時間內寫出bug free的代碼,一旦出現BUG,這輪面試基本就掛了。另外,FB比較強調最優解。比如,會先問你2sum,然後拓展到3sum,4sum。比如經典的動態規劃,背包問題以及所有的follow up,都是比較經典的常考題目。

Linkedin,面試難度7分
Linkedin的面試難度適中,Leetcode上中等難度的題目居多,經典一點的,比如nested element iterator, sqrt, paint fence都是比較經典的題目。大概的難度都在這個範圍之內

Amazon,面試難度6.5
整體而言,亞馬遜在矽谷的四大巨頭裡的面試,技術難度是最低的,但是能夠成功通過面試並沒多很多。原因在於亞馬遜很看重行為類問題(behaviral question)以及公司的文化配合(culture fit)。技術方面,經典一點的題目,比如最長迴文串,二叉樹層遍歷,二叉樹validate等等

Google,面試難度9.5
狗家的面試題目,在LEETCODE上算是medium偏難,以及一些hard的題目。但最難的點在於,谷歌有自己的題庫,而且是不斷跟新的,這個就無形中增大了面試難度。題目方面,谷歌考得很全面,線段樹(segment tree),動態規劃DP,以及圖,是常出現的。

整體來說,面試演算法題這是一個很大的話題,一段話很難概括清楚,上次本人做過一次灣區的公司面試準備的講座,講了接近4小時。如果有額外的問題,可以私信我。

希望對你有所幫助


針對本科和碩士應屆生的演算法面試題:

1、假設淘寶一天有5億條成交數據,求出銷量最高的100個商品並給出演算法的時間複雜度。

2、給一列無序數組,求出中位數並給出演算法的時間複雜度。

3、輸入一個整型數組,求出子數組和的最大值,並給出演算法的時間複雜度。

4、給出10W條人和人之間的朋友關係,求出這些朋友關係中有多少個朋友圈(如A-B、B-C、D-E、E-F,這4對關係中存在兩個朋友圈),並給出演算法的時間複雜度。

5、如圖所示的數字三角形,從頂部出發,在每一結點可以選擇向左走或得向右走,一直走到底層,要求找出一條路徑,使路徑上的值的和最大。給出演算法的時間複雜度。

6、有一個很長二進位串,求出除以3的餘數是多少,給出演算法的時間複雜度。


===============================================================


都是基本的演算法的數據結構,搞過oi/acm的一眼就能秒,只有最後一題有點抖機靈。


在杭州面了兩場校招,對象是一本的計算機相關專業應屆碩士生,整體通過率不理想,回答滿意的只有10%。



1.《編程之美》
2. 《劍指offer》
3. 《程序員面試金典》

OJ
1. leetcode: Problems | LeetCode OJ
2. codility: Take our free programming lessons
順帶附上我的解題代碼repository:PerthCharles/Coding · GitHub

拓展
1. 待字閨中:待字閨中 -- 微信公眾賬號 -- 傳送門
2. 數據結構:List of data structures
3. 常見演算法:List of algorithms
4. 微軟面試100題系列:微軟面試100題2010年版全部答案集錦(含下載地址)

最後,找一些志同道合的朋友,一起學(da)習(guai)算(sheng)法(ji)。


Fei Dong | LinkedIn

廣告一下,歡迎大家參加免費公開課
《美國大數據工程師面試攻略》——董飛,9月7日,上午10:30

#############
我的面試高頻題
coding:
- JOIN: nested join, hash join, sort-merge join
- Number: Fibonacci, prime,隨機取文件某一行
- String: strstr, wordcount
- Tree: height, lca, balance tree
- Heap: 查找最大的k個數
- DP: 最大連續子串和
- array: find a key in rotated array, 去除重複字元
- linkedlist: 是否有環,插入結點,刪除重複結點 
- 遞歸回溯:變化很多,這方面需要大量練習

知識性:
多線程,mutex/semaphore
java GC
C++ virtual, smart pointer
regex使用
資料庫:知道btree, 索引
search engine: 倒排表,拉鏈,稀疏索引,空間向量模型,tf*idf,
large scale data: hash, consistent hash, bloom filter, bitmap, 外排序,
partition
分散式:CAP理論,gossip,Paxos, GFS設計思想
network: socket, tcp3次握手, asyschnoized io, epoll, select, 驚群

設計型:
queue/stack實現
LRU
trie tree
設計遊戲
四則運算求值

我感覺把我上面說的練熟,還是很大可能性遇到的,雖然不是很全面,但我覺得不應該
把太多時間花在難題上,充實知識體系,符合職位要求更重要。

標 題: 低頻題小節
發信站: BBS 未名空間站 (Sun Mar 4 13:17:29 2012, 美東)

我在面試中,發現還是有時候很難去準備的,聽起來也很怪,我就隨便列一些我遇到的
低頻題給大家看看,有個感覺。

語言細節
1. python yield什麼意思,generator,如何操作系統命令popen跟os.system區別
2. 問我API是叫什麼,作用是如何把一個path 和文件連起來,path+name,我後來才明
白是說path裡面有可能最後沒/,path="/ab" , name = "ef"
3. java實現多線程的三種方式
4. java跟c++模板的區別

高級演算法
1. 圖論:把一個有向圖劃分成幾個區域,每個區域用一中顏色染色,強連通?

分散式理論
2 phase commit是啥
vector clock
一致性hash,分散式hash

資料庫
數據如何備份,把mysql導入導出命令給寫出來,load data...

信息處理:
如何消重,去除spam

數學
1. reject sampling, 計算期望

linux內核
1. linux的原語是怎麼實現的
2. 軟練和硬連的區別
3. kill -9 9是什麼意思,會不會有些進程永遠殺不死
4. ls -l /dev
brw-r----- 1 root operator 14, 0 Feb 29 01:48 disk0
解釋每個字元什麼意思,14是什麼

計算機原理
CPU L1, L2, L3 cache, memory 速度
磁碟讀寫速度
SSD跟Sata磁碟區別


2017年校招,總共面試10家互聯網公司,總結一下大概遇到的演算法題。
1.數組中逆序對計算。(劍指offer)
2.判讀一個樹是不是另一個樹的子樹(劍指offer)
3.數據流要求o(1)求得中位數,o(lgn)插入(劍指offer)
4.順時針列印矩陣(劍指offer)
5.複雜鏈表複製(劍指offer)
6.二叉排序樹中第k小的數(劍指offer)
7.反轉鏈表遞歸 、非遞歸(劍指offer)
8.鏈表中倒數第k個結點(劍指offer)
9.數組中超過一半的數字(劍指offer)
10.左旋轉字元串(劍指offer)
11.把二叉樹列印成多行(劍指offer)
12.旋轉數組查找(劍指offer)
13.鏈表歸併排序
14.Trapping Rain Water https://leetcode.com/problems/trapping-rain-water/
15.Longest Palindromic Substring https://leetcode.com/problems/longest-palindromic-substring/
16.Gray Code https://leetcode.com/problems/gray-code/
17.Binary Tree Maximum Path Sum https://leetcode.com/problems/binary-tree-maximum-path-sum/
18.Search for a Range https://leetcode.com/problems/search-for-a-range/
19.算術表達式轉逆波蘭表達式(後綴表達)
20.k-means
21.字元串由大小寫字母組成,要求去重,只允許使用幾個int臨時變數,要求時間複雜度儘可能少
22.青蛙每次跳台階,每次一步或者二步,青蛙總共可以跳n次,台階共m階(n&<=m),每個台階有若干害蟲,使得青蛙吃的害蟲最多。
23.左右括弧組成的字元串,去除最少使得剩餘的字元串是合法的(符合左右括弧規則)
24.實現5選3 組合
25.數組中後面的數減前面的數差的最大值,要求時間、空間複雜度儘可能低
26.多個有序數組的歸併
27.多個有序數組求交集
28.二個有序數組求差集
29.字元串中最長不重複子串
30.小於10萬的迴文數的個數
總結:多刷幾遍劍指offer!!!


1 前言

答案只包含摘要目錄等,博文太長,詳見:
面試高級演算法梳理筆記 - 簡書

2 目錄

按演算法難度劃分為初中高三個級別,詳細目錄及鏈接如下:

  • 初級篇

    1. 窮竭搜索
    2. 貪心
    3. 動態規劃
    4. 數據結構
    5. 圖論
    6. 數論
  • 中級篇

    1. 二分搜索
    2. 常用技巧
    3. 數據結構(二)
    4. 動態規劃(二)
    5. 網路流
    6. 計算幾何
  • 高級篇

    1. 數論(二)
    2. 博弈論
    3. 圖論(二)
    4. 常用技巧(二)
    5. 智慧搜索
    6. 分治
    7. 字元串

3 題解

配套習題及詳解同步發布在GitHub倉庫acm-challenge-workbook,持續更新,預計在2017年3月完成。習題難度從國內機試、國外IT名企面試到ACM地區賽不等,吃透演算法習題冊,應聘足以。

4 題庫

  • Google Code Jam(GCJ)
  • Peking University Online Judge(POJ)
  • CodeForces(CF)
  • LeetCode(LC)
  • Aizu Online Judge(AOJ)

nowcoder上有很多互聯網公司常見的筆試面試題http://www.nowcoder.com/questionCenter。
拿走不謝


這是別人的話我只是引用一下:"我在《再談「我是怎麼招程序員」》中比較保守地說過,「問難的演算法題並沒有錯,錯的很多面試官只是在膚淺甚至錯誤地理解著面試演算法題的目的。」,今天,我想加強一下這個觀點——我反對純演算法題面試!(注意,我說的是純演算法題)圖片源Wikipedia(點擊圖片查看詞條)我再次引用我以前的一個觀點——能解演算法題並不意味著這個人就有能力就能在工作中解決問題,你可以想想,小學奧數題可能比這些題更難,但並不意味著那些奧數能手就能解決實際問題。好了,讓我們來看一個示例(這個示例是昨天在微博上的一個討論),這個題是——「找出無序數組中第2大的數」,幾乎所有的人都用了O(n)的演算法,我相信對於我們這些應試教育出來的人來說,不用排序用O(n)演算法是很正常的事,連我都不由自主地認為O(n)演算法是這個題的標準答案。我們太習慣於標準答案了,這是我國教育最悲哀的地方。(廣義的洗腦就是讓你的意識依賴於某個標準答案,然後通過給你標準答案讓你不會思考而控制你)功能性需求分析試想,如果我們在實際工作中得到這樣一個題 我們會怎麼做?我一定會分析這個需求,因為我害怕需求未來會改變,今天你叫我找一個第2大的數,明天你找我找一個第4大的數,後天叫我找一個第100大的數,我不搞死了。需求變化是很正常的事。分析完這個需求後,我會很自然地去寫找第K大數的演算法——難度一下子就增大了。很多人會以為找第K大的需求是一種「過早擴展」的思路,不是這樣的,我相信我們在實際編碼中寫過太多這樣的程序了,你一定不會設計出這樣的函數介面 —— Find2ndMaxNum(int* array, int len),就好像你不會設計出 DestroyBaghdad(); 這樣的介面,而是設計一個DestoryCity( City ); 的介面,而把Baghdad當成參數傳進去!所以,你應該是聲明一個叫FindKthMaxNum(int* array, int len, int kth),把2當成參數傳進去。這是最基本的編程方法,用數學的話來說,叫代數!最簡單的需求分析方法就是把需求翻譯成函數名,然後看看是這個介面不是很二?!(註:不要糾結於FindMaxNum()或FindMinNum(),因為這兩個函數名的業務意義很清楚了,不像Find2ndMaxNum()那麼二)非功能性需求分析性能之類的東西從來都是非功能性需求,對於演算法題,我們太喜歡研究演算法題的空間和時間複雜度了。我們希望做到空間和時間雙豐收,這是演算法學術界的風格。所以,習慣於標準答案的我們已經失去思考的能力,只會機械地思考演算法之內的性能,而忽略了演算法之外的性能。如果題目是——「從無序數組中找到第K個最大的數」,那麼,我們一定會去思考用O(n)的線性演算法找出第K個數。事實上,也有線性演算法——STL中可以用nth_element求得類似的第n大的數,其利用快速排序的思想,從數組S中隨機找出一個元素X,把數組分為兩部分Sa和Sb。Sa中的元素大於等於X,Sb中元素小於X。這時有兩種情況:1)Sa中元素的個數小於k,則Sb中的第 k-|Sa|個元素即為第k大數;2) Sa中元素的個數大於等於k,則返回Sa中的第k大數。時間複雜度近似為O(n)。搞學術的nuts們到了這一步一定會歡呼勝利!但是他們哪裡能想得到性能的需求分析也是來源自業務的!我們一說性能,基本上是個人都會問,請求量有多大?如果我們的FindKthMaxNum()的請求量是m次,那麼你的這個每次都要O(n)複雜度的演算法得到的效果就是O(n*m),這一點,是書獃子式的學院派人永遠想不到的。因為應試教育讓我們不會從實際思考了。工程式的解法根據上面的需求分析,有軟體工程經驗的人的解法通常會這樣:1)把數組排序,從大到小。2)於是你要第k大的數,就直接訪問 array[k]。排序只需要一次,O(n*log(n)),然後,接下來的m次對FindKthMaxNum()的調用全是O(1)的,整體複雜度反而成了線性的。其實,上述的還不是工程式的最好的解法,因為,在業務中,那數組中的數據可能會是會變化的,所以,如果是用數組排序的話,有數據的改動會讓我重新排序,這個太耗性能了,如果實際情況中會有很多的插入或刪除操作,那麼可以考慮使用B+樹。工程式的解法有以下特點:1)很方便擴展,因為數據排好序了,你還可以方便地支持各種需求,如從第k1大到k2大的數據(那些學院派寫出來的代碼在拿到這個需求時又開始撓頭苦想了)2)規整的數據會簡化整體的演算法複雜度,從而整體性能會更好。(公欲善其事,必先利其器)3)代碼變得清晰,易懂,易維護!(學院派的和STL一樣的近似O(n)複雜度的演算法沒人敢動)爭論你可能會和我有以下爭論,如果程序員做這個演算法題用排序的方式,他一定不會像你想那麼多。是的,你說得對。但是我想說,很多時候,我們直覺地思考,恰恰是正確的路。因為「排序」這個思路符合人類大腦處理問題的方式,而使用學院派的方式是反大腦直覺的。反大腦直覺的,通常意味著晦澀難懂,維護成本上升。就是一道面試題,我就是想測試一下你的演算法技能,這也扯太多了。沒問題,不過,我們要清楚我們是在招什麼人?是一個只會寫演算法的人,還是一個會做軟體的人?這個只有你自己最清楚。這個演算法題太容易誘導到學院派的思路了。是的這道「找出第K大的數」,其實可以變換為更為業務一點的題目——「我要和別的商戶競價,我想排在所有競爭對手報價的第K名,請寫一個程序,我輸入K,和一個商品名,系統告訴我應該訂多少價?(商家的所有商品的報價在一數組中)」——業務分析,整體性能,演算法,數據結構,增加需求讓應聘者重構,這一個問題就全考了。你是不是在說演算法不重要,不用學?千萬別這樣理解我,搞得好像如果面試不面,我就可以不學。演算法很重要,演算法題能鍛煉我們的思維,而且也有很多實際用處。我這篇文章不是讓大家不要去學演算法,這是完全錯誤的,我是讓大家帶著業務問題去使用演算法。問你業務問題,一樣會問到演算法題上來。小結看過這上面的分析,我相信你明白我為什麼反對純演算法面試題了。原因就是純演算法的面試題根本不能反應一個程序的綜合素質!那麼,在面試中,我們應該要考量程序員的那些綜合素質呢?我以為有下面這些東西:會不會做需求分析?怎麼理解問題的?解決問題的思路是什麼?想法如何?會不會對基礎的演算法和數據結構靈活運用?另外,我們知道,對於軟體開發來說,在工程上,難是的下面是這些挑戰:軟體的維護成本遠遠大於軟體的開發成本。軟體的質量變得越來越重要,所以,測試工作也變得越來越重要。軟體的需求總是在變的,軟體的需求總是一點一點往上加的。程序中大量的代碼都是在處理一些錯誤的或是不正常的流程。所以,對於編程能力上,我們應該主要考量程序員的如下能力:設計是否滿足對需求的理解,並可以應對可能出現的需求變化。"


推薦大家http://tilaile.com,互聯網公司最常見的面試演算法題裡面都按公司職位做好了歸類,特別適合快速瀏覽,筆試面試前,刷一刷還是很有必要的。


請移步leetcode:LeetCode Online Judge


說下在百度、阿里客戶端面試中問到的一些問題吧:
登錄中,密碼如何加密傳輸
子串的查找
快排
紅黑樹
B+樹
多線程死鎖的原因以及解決方法


白板上翻轉二叉樹。(逃


我這個回答,不是來幫助面試者的,而是來批判面試官的。

我所知道最常見(沒有之一)的面試演算法問題就是:請實現快速排序。

可能快速排序演算法被普遍認為難度合適,既不會像冒泡排序那樣low,又不會難到半小時之內寫不出來,所以總被拿來當做面試題。

可是,在工作中真的有人會去寫快速排序演算法嗎?快速排序演算法不是已經被各種庫實現了我們直接用就行了嗎?

一個有效的面試,應該考察面試者適應工作的能力,招他/她進來之後他/她都不會有機會在工作中去寫快速排序,那問這個問題幹嘛?

我個人的觀點:面試官不去自己的工作中找相關實際問題,而是拿根本不會用上的快速排序實現來考察面試者,是懶惰的做法。

當然,對於毫無工作經驗的面試者,比如剛剛大學畢業,也許就穩一點課本知識就好,會快速排序的大概率應該比不會的靠譜點吧,不過,這是基於你完全找不到更好的問題而言,你真的找不到更好的問題嗎?我覺得未必,你要用心思考,肯定能找到更合適的方法。

做個廣告,我開了個Live 如何做好面試官 ,專門講如何做好面試官。


快排


面過兩個遊戲公司。
考到的演算法題有:
快速排序演算法的實現和複雜度(平均和最差),一個簡單的動態規劃題目,hash等...
還有一個比較有趣的題目:大數據的排序方法:(例如32位整數,100億個數字)
當然會有很多種解法:
例如分組快排,再兩兩合併
又或者多次桶排
當然面試官考的是你對實際問題的分析和解決能力。


我能說我被問了
列印n對括弧可能組合
卡特蘭數的推導原理
完美洗牌演算法
么。。


國內有本書叫《劍指Offer》,作者有163的博客,裡面的題比較常見,反正我面試經常碰到。
推薦買來看看。


推薦閱讀:

面試時把地上的廢紙撿起來真的能被錄用嗎?
軟體開發工程師的面試應該考察哪些素質,如何做權衡?

TAG:面試 | 演算法 | 程序員面試 | 面試問題 | 互聯網公司 |