『壹』 如何准備演算法面試
主要介紹演算法面試的一些問題、以及如何准備演算法面試
!--more--
演算法面試不僅僅是正確的回答問題
對於面試中遇到的大多數問題,都能有一個合理的思考路徑
讓大家在面對面試中的演算法問題時,有一個合理的思考路徑:
不代表能夠「正確」回答每一個演算法問題,但是合理的思考方向其實更重要,也是正確完成演算法面試問題的前提
演算法面試優秀不意味著技術面試優秀
技術面試優秀不意味著能夠拿到Offer
演算法面試的目的不是給出一個「正確」答案,
而是展示給面試官你思考問題的方式。
演算法面試不是高考。
把這個過程看作是和面試官一起探討一個問題的解決方案。
對於問題的細節和應用環境,可以和面試官溝通。
這種溝通本身很重要,它暗示著你思考問題的方式。
我們需要對一組數據進行排序
設計排序介面,標准庫的設計,業務中排序演算法。
排序是基礎操作,很重要。
解決
快速排序演算法:O(nlogn)
忽略了演算法使用的基礎環境。要動態選擇。
(向面試官提問):這組數據有什麼樣的特徵?
有沒有可能包含有大量重復的元素?
如果有這種可能的話,三路快排是更好地選擇。
普通數據:普通快速排序就行了;java語言標准庫排序使用的三路快排。
是否大部分數據距離它正確的位置很近?是否近乎有序?
如果是這樣的話,插入排序是更好地選擇。
按照業務發生順序,先發生先完成,幾乎有序,插入排序是更好的選擇。
是否數據的取值范圍非常有限?比如對學生成績排序。
如果是這樣的話,計數排序是更好地選擇。高考成績取值范圍有限:計數排序更好。
(向面試官提問):對排序有什麼額外的要求?
是否需要穩定排序?
如果是的話,歸並排序是更好地選擇。
(向面試官提問):數據的存儲狀況是怎樣的?
是否是使用鏈表存儲的?
如果是的話,歸並排序是更好地選擇。
快排依賴於數組的隨機存取。
(向面試官提問):數據的存儲狀況是怎樣的?
數據的大小是否可以裝載在內存里?
數據量很大,或者內存很小,不足以裝載在內存里,需要使用外排序演算法。
有沒有可能包含有大量重復的元素?
是否大部分數據距離它正確的位置很近?是否近乎有序?
是否數據的取值范圍非常有限?比如對學生成績排序。
是否需要穩定排序?
是否是使用鏈表存儲的?
數據的大小是否可以裝載在內存里?
正確除了你能把代碼編出來運行出正確的結果。正確還包含對問題的獨到見解;優化;代碼規范;容錯性;
o 不僅僅是給出解決演算法問題的代碼,還要把上面因素包括。
o 如果是非常難的問題,對你的競爭對手來說,也是難的。
關鍵在於你所表達出的解決問題的思路。
甚至通過表達解題思路的方向,得出結論:這個問題的解決方案,應該在哪一個領域,我可以通過查閱或者進一步學習解決問題。
演算法面試只是面試的一部分
演算法面試只是技術面試的一部分。
根據你的簡歷和應聘職位的不同,勢必要考察其他技術方面。
項目經歷和項目中遇到的實際問題
o 解決能力,是否參與
o 深入思考
o 技術態度
面試前梳理自己簡歷上所寫到的項目:整理一下可能會問到的。
你遇到的印象最深的bug是什麼?
面向對象
設計模式
網路相關;安全相關;內存相關;並發相關;…
系統設計;scalability(大規模)
技術面試只是面試的一部分。面試不僅僅是考察你的技術水平,還是了解你的過去以及形成的思考行為方式。
關於過去:參與項目至關重要
工作人士
研究生
本科生
o 畢業設計
o 其他課程設計(大作業)
實習
創建自己的項目
o 自己做小應用:計劃表;備忘錄;播放器…
o 自己解決小問題:爬蟲;數據分析;詞頻統計...
o 「不是項目」的項目:一本優秀的技術書籍的代碼整理等…(github)
o 分享:自己的技術博客;github等等
通過過去了解你的思考行為方式:
遇到的最大的挑戰?
犯過的錯誤?
遭遇的失敗?
最享受的工作內容?
遇到沖突的處理方式?
做的最與眾不同的事兒?
具體闡述:我在某某項目中遇到一個怎樣的演算法問題:這個問題是怎樣的。它是我遇到的最大的挑戰,我是如何克服解決的。
整個小組的大概運行模式是怎樣的?
整個項目的後續規劃是如何的?
這個產品中的某個問題是如何解決的?
為什麼會選擇某些技術?標准?
我對某個技術很感興趣,在你的小組中我會有怎樣的機會深入這種技術?
演算法面試仍然是非常重要的一部分
如何准備演算法面試
准備面試和准備演算法面試是兩個概念
演算法面試,只是面試中的一個環節。
遠遠不需要啃完一本《演算法導論》
o 強調理論證明
o 第一遍讀不需要弄懂證明
o 前幾遍閱讀應該記住結論就行了,不需要弄懂證明。把更多的精力放在演算法思想上。
針對演算法面試,演算法導論裡面的理論推導和證明不是很重要的方面。
選擇合適的oj
leetcode
o Online Portal for IT Interview
o 真實的面試問題
o http://www.leetcode.com
HankeRank
o 特點是對於問題的分類很詳細。偏難,不過可以對某一類細分問題解決。
o http://www.hackerrank.com
在學習和實踐做題之間,要掌握平衡
基礎演算法實現與演算法思想
如何回答演算法面試問題
注意題目中的條件
o 給定一個有序數組...(二分法)
有一些題目中的條件本質是暗示
o 設計一個O(nlogn)的演算法(分治:在一顆搜索樹中完成任務,對於數據排序)
o 無需考慮額外的空間(用空間換時間上的優化)
o 數據規模大概是10000(O(n^2)就可以)
當沒有思路的時候
自己給自己幾個簡單的測試用例,試驗一下
不要忽視暴力解法。暴力解法通常是思考的起點。
例子
LeetCode 3 LongestSubstringWithout Repeating Characters
在一個字元串中尋找沒有重復字母的最長子串
如」abcabcbb」,則結果為」abc」
如」bbbbb」,則結果為」b」
對於字元串s的子串s[i...j]
使用O(n^2)的演算法遍歷i,j,可以得到所有的子串s[i...j]
使用O(length(s[i...j]))的演算法判斷s[i...j]中是否含有重復字母
三重循環:復雜度O(n^3),對於n=100的數據,可行
遍歷常見的演算法思路
遍歷常見的數據結構
空間和時間的交換(哈希表)
預處理信息(排序)
在瓶頸處尋找答案:O(nlogn)+ O(n^2); O(n^3)
o O(n^2)能否優化。
什麼樣的問題使用什麼樣的思路和數據結構。
極端條件的判斷
o 數組為空?
o 字元串為空?
o 數量為0?
o 指針為NULL?
代碼規范:
o 變數名
o 模塊化
o 復用性
『貳』 知名公司經典演算法筆試題和面試題答案
微軟
有一個整數數組,請求出兩兩之差絕對值最小的值,記住,只要得出最小值即可,不需要求出是哪兩個數。
寫一個函數,檢查字元是否是整數,如果是,返回其整數值。(或者:怎樣只用4行代碼編寫出一個從字元串到長整形的函數?)
給出一個函數來輸出一個字元串的所有排列。
請編寫實現malloc()內存分配函數功能一樣的代碼。給出一個函數來復制兩個字元串A和B。字元串A的後幾個位元組和字元串B的前幾個位元組重疊。
怎樣編寫一個程序,把一個有序整數數組放到二叉樹中?
怎樣從頂部開始逐層列印二叉樹結點數據?請編程。
怎樣把一個鏈表掉個順序(也就是反序,注意鏈表的邊界條件並考慮空鏈表)?
請編寫能直接實現int atoi(const char * pstr)函數功能的代碼。
編程實現兩個正整數的除法,編程實現兩個正整數的除法,當然不能用除法操作符。
1
// return x/y.
2
int span(const int x, const int y)
3
{
4
....
5
}
在排序數組中,找出給定數字的出現次數,比如 [1, 2, 2, 2, 3] 中2的出現次數是3次。
平面上N個點,每兩個點都確定一條直線,求出斜率最大的那條直線所通過的兩個點(斜率不存在的情況不考慮)。時間效率越高越好。
一個整數數列,元素取值可能是0~65535中的任意一個數,相同數值不會重復出現。0是例外,可以反復出現。請設計一個演算法,當你從該數列中隨意選取5個數值,判斷這5個數值是否連續相鄰。注意:
5個數值允許是亂序的。比如:8 7 5 0 6
0可以通配任意數值。比如:8 7 5 0 6 中的0可以通配成9或者4
0可以多次出現。
復雜度如果是O(n2)則不得分。
設計一個演算法,找出二叉樹上任意兩個結點的最近共同父結點。復雜度如果是O(n2)則不得分。
一棵排序二叉樹,令 f=(最大值+最小值)/2,設計一個演算法,找出距離f值最近、大於f值的結點。復雜度如果是O(n2)則不得分。
一個整數數列,元素取值可能是1~N(N是一個較大的正整數)中的任意一個數,相同數值不會重復出現。設計一個演算法,找出數列中符合條件的數對的個數,滿足數對中兩數的和等於N+1。復雜度最好是O(n),如果是O(n2)則不得分。
Google
正整數序列Q中的每個元素都至少能被正整數a和b中的一個整除,現給定a和b,需要計算出Q中的前幾項,例如,當a=3,b=5,N=6時,序列為3,5,6,9,10,12 (1)、設計一個函數void generate(int a,int b,int N ,int * Q)計算Q的前幾項(2)、設計測試數據來驗證函數程序在各種輸入下的正確性。
有一個由大小寫組成的字元串,現在需要對他進行修改,將其中的所有小寫字母排在答謝字母的前面(大寫或小寫字母之間不要求保持原來次序),如有可能盡量選擇時間和空間效率高的演算法 c語言函數原型void proc(char *str) 也可以採用你自己熟悉的語言。
如何隨機選取1000個關鍵字,給定一個數據流,其中包含無窮盡的搜索關鍵字(比如,人們在谷歌搜索時不斷輸入的關鍵字)。如何才能從這個無窮盡的流中隨機的選取1000個關鍵字?
判斷一個自然數是否是某個數的平方。說明:當然不能使用開方運算。
給定能隨機生成整數1到5的函數,寫出能隨機生成整數1到7的函數。
1024! 末尾有多少個0?
有5個海盜,按照等級從5到1排列,最大的海盜有權提議他們如何分享100枚金幣。但其他人要對此表決,如果多數反對,那他就會被殺死。他應該提出怎樣的方案,既讓自己拿到盡可能多的金幣又不會被殺死?(提示:有一個海盜能拿到98%的金幣)
23、Google2015華南地區筆試題。給定一個集合A=[0,1,3,8](該集合中的元素都是在0,9之間的數字,但未必全部包含),指定任意一個正整數K,請用A中的元素組成一個大於K的最小正整數。比如,A=[1,0] K=21 那麼輸出結構應該為100。
網路
用C語言實現一個revert函數,它的功能是將輸入的字元串在原串上倒序後返回。
用C語言實現函數void * memmove(void *dest, const void *src, size_t n)。memmove 函數的功能是拷貝src所指的內存內容前n個位元組到dest所指的地址上。分析:由於可以把任何類型的指針賦給void類型的指針,這個函數主要是實現各種數據類型的拷貝。
有一根27厘米的細木桿,在第3厘米、7厘米、11厘米、17厘米、23厘米這五個位置上各有一隻螞蟻。木桿很細,不能同時通過一隻螞蟻。開始時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭,但不會後退。當任意兩只螞蟻碰頭時,兩只螞蟻會同時調頭朝反方向走。假設螞蟻們每秒鍾可以走一厘米的距離。編寫程序,求所有螞蟻都離開木桿的最小時間和最大時間。
騰訊
請定義一個宏,比較兩個數a、b的大小,不能使用大於、小於、if語句
兩個數相乘,小數點後位數沒有限制,請寫一個高精度演算法
有A、B、C、D四個人,要在夜裡過一座橋。他們通過這座橋分別需要耗時1、2、5、10分鍾,只有一支手電筒,並且同時最多隻能兩個人一起過橋。請問,如何安排,能夠在17分鍾內這四個人都過橋?
有12個小球,外形相同,其中一個小球的質量與其他11個不同,給一個天平,問如何用3次把這個小球找出來,並且求出這個小球是比其他的輕還是重
在一個文件中有 10G 個整數,亂序排列,要求找出中位數。內存限制為 2G。只寫出思路即可。
一個文件中有40億個整數,每個整數為四個位元組,內存為1GB,寫出一個演算法:求出這個文件里的整數里不包含的一個整數。
騰訊伺服器每秒有2w個QQ號同時上線,找出5min內重新登入的qq號並列印出來。 1 2
『叄』 2019人人網演算法類筆試題和面試題答案匯總
如下為大家匯總的內容是人人網演算法類筆試題,感興趣的朋友可以練習下。
1.給出一個有序數組啊,長度為len,另外給出第三個數X,問是否能在數組中找到兩個數,這兩個數之和等於第三個數X。
我們首先看到第一句話,這個數組是有序的,所以,我們可以定義兩個指針,一個指向數組的第一個元素,另一個指向應該指向的位置(這個需要看具體的實現和數組給定的值),首先計算兩個位置的和是否等於給定的第三個數,如果等於則演算法結束,如果大於,則尾指針向頭指針方向移動,如果小於,則頭指針向尾指針方向移動,當頭指針大於等於尾指針時演算法結束,沒有找到這樣的兩個數。
解法一:
#include
int judge(int *a, int len, int k, int *num1, int *num2);
int main(int argc, char **argv)
{
int test_array[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
int result = -1;
int num1, num2;
result = judge(test_array, sizeof(test_array) / sizeof(int), 12, &num1, &num2);
if(result == 0)
{
printf("%d %d ", num1, num2);
}
else if(result == -1)
{
printf("can't find");
}
else
{
printf("error");
}
}
int judge(int *a, int len, int k, int *num1, int *num2)
{
int *low = NULL;
int *high = NULL;
int i = 0;
int result = -1;
if(a == NULL || len < 2)
{
return result;
}
if(a[0] >= k)
{
return result;
}
while(a[i] <= k && i < len)
{
i++;
}
low = a;
high = a + i - 1;
while(low < high)
{
*num1 = *low;
*num2 = *high;
if((*low + *high) == k)
{
result = 0;
break;
}
else if((*low + *high) > k)
{
high--;
}
else if((*low + *high) < k)
{
low++;
}
}
return result;
}
解法二:
#include
using namespace std;
int hash_table[100];
bool judge(int *a, int len, int x)
{
memset(hash_table, 0, sizeof(hash_table));
for (int i=0; i
{
hash_table[x - a[i]] = 1;
}
for (int i=0; i
{
if (hash_table[i] == 1)
{
return true;
}
}
return false;
}
int main()
{
int len = 10;
int a[10] = {1, 3, 5, 7, 9, 4, 2, 8, 10, 6};
int x = 19;
if (judge(a, len, x))
{
cout<<"Yes"<
}
else
{
cout<<"No"<
}
system("pause");
return 0;
}
本題解決方法:hash table。
時間復雜度:O(N)
空間復雜度:O(N)
2.給定有n個數的數組a,其中有超過一半的數為一個定值,在不進行排序,不開設額外數組的情況下,以最高效的演算法找出這個數。
int find(int* a, int n);
#include
using namespace std;
int find(int *a, int n)
{
int t = a[0];
int count = 0;
for (int i=0; i
{
if (count == 0)
{
t = a[i];
count = 1;
continue;
}
else
{
if (a[i] == t)
{
count++;
}
else
{
count--;
}
}
}
return t;
}
int main()
{
int n = 10;
int a[10] = {1, 3, 2, 3, 3, 4, 3, 3, 3, 6};
cout<
system("pause");
return 0;
}
Time Complexity: O(n)
Space Complexity:O(1) 更多熱門的筆試題目推薦:
中國人民銀行的筆試題
上海東方傳媒集團筆試題
廣東北電研發工程師筆試題
金融投資顧問常考筆試題目
『肆』 示知一下九章演算法面試高頻題沖刺班2021怎麼樣 值得學嗎
我學了,課程很不錯!而且花了不到一折的價格!我是在共眾號< 阿寧寶庫> 領取的,真的是白菜價,省了不少!,你也可以關注共眾號< 阿寧寶庫>會給你驚喜的....你也可以網路下。
『伍』 經典筆試面試知識整理,數據結構與演算法(代碼演示)
題目描述:
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
輸入描述: array: 待查找的二維數組 target:查找的數字
輸出描述:
查找到返回true,查找不到返回false
題目描述:
請實現一個函數,將一個字元串中的空格替換成「%20」。例如,當字元串為We Are Happy.則經過替換之後的字元串為We%20Are%20Happy。
題目描述: 輸入一個鏈表,從尾到頭列印鏈表每個節點的值。
輸入描述: 輸入為鏈表的表頭
輸出描述: 輸出為需要列印的「新鏈表」的表頭
題目描述:
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。
例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
題目描述:
把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個遞增排序的數組的一個旋轉,輸出旋轉數組的最小元素。
例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。 NOTE:給出的所有元素都大於0,若數組大小為0,請返回0。
1、題目描述:
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。n<=39
2、題目描述:
一隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上一個n級的台階總共有多少種跳法。
3、題目描述:
一隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的台階總共有多少種跳法。
4、題目描述:
我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?
1、題目描述:
輸入一個整數,輸出該數二進製表示中1的個數。其中負數用補碼表示。
2、題目描述:
給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。
題目描述:
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
題目描述:
用兩個棧來實現一個隊列,完成隊列的Push和Pop操作, 隊列中的元素為int類型。
題目描述:
輸入一個鏈表,輸出該鏈表中倒數第k個結點。
『陸』 小象學院的bat面試演算法課程怎麼樣
小象學院太坑!!!!!!花了400多,沒時間看,等有時間看的時候,告訴你課程過期要續費,資料頁下載不了了!!!而且即使是續費,也不是永久,還是只能看一年!!!365天後和課程永遠拜拜,並且沒地兒說理去!!!!
『柒』 大公司筆試面試有哪些經典演算法題目
1、二維數組中的查找
具體例題:如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為迴文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是迴文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是迴文序列。現在給出一個數字序列,允許使用一種轉換操作:選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。現在對於所給序列要求出最少需要多少次操作可以將其變成迴文序列?
『捌』 acwing里的yxc是誰
acwing里的yxc是閆學燦。
yxc北京大學 本名閆學燦,2011年獲得NOI金牌,並保送北京大學計算機系。2018年初創辦AcWing演算法交流平台。
AcWing的創始人就是閆學燦。AcWing,北京睿新奇知科技有限公司旗下品牌,擁有演算法系列精品課程-AcWing 演算法全家桶,配備全面系統的知識講解,配套題庫的實戰訓練,專業在線的答疑輔導。
品牌理念
致力於幫助同學們從新手小白開始,用系統的學習方式成長為演算法大佬。
產品系列
語法基礎課、演算法基礎課、演算法提高課、演算法進階課、考研演算法輔導課、藍橋杯C++AB組輔導課、CCF-CSP認證輔導課、PAT甲級輔導課、CSP-J(NOIP普及組)輔導課、USACO Training輔導課、演算法筆試面試輔導課等針對性訓練課程。
以上內容參考網路-AcWing
『玖』 演算法崗面試指南(上)
無論是春招還是秋招,應屆還是在職的從業人員,我們在面試演算法總會被問到一些基本功。如果你還在四處貼吧博客論壇尋找面經的話,不妨可以看看我整理的內容,一次性解決你的面試難題!
首先來看機器學習方面,我整理了一份長達60頁的word文檔,共分為13個模塊。收集了最常見的機器學習問題以及解答。
目錄內容非常多,無法一一展示。
監督學習、無監督學習、概率模型、偏差方差....這些你都能掌握嗎?
對常見的機器學習演算法進行梳理與歸納,在面試前看一看事半功倍。
當然也有大家最頭痛的數學原理推導的內容。
只要你認認真真看完,找一份好的演算法崗位工作肯定是不成問題。
當然這份資料不是free的,但是可以放心只收取一點辛苦整理費。看過我專欄文章的都應該也清楚其中的質量。
我的朋友,五十rm b不到可以為你打開一扇大門何樂而不為呢?有需要的同學可以直接私聊,有在就會回復~