天天看點

800道面試題和43道JAVA算法/資料結構面試題

1、題目:

輸入一個正整數數組,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則列印出這三個數字能排成的最小數字為321323。

2、題目:

輸入某二叉樹的前序周遊和中序周遊的結果,請重建出該二叉樹。假設輸入的前序周遊和中序周遊的結果中都不含重複的數字。例如輸入前序周遊序列{1,2,4,7,3,5,6,8}和中序周遊序列{4,7,2,1,5,3,8,6},則重建二叉樹并傳回。

3、題目:

給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。

4、題目:

偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識别中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,并期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和為8(從第0個開始,到第3個為止)。你會不會被他忽悠住?(子向量的長度至少是1) 代碼:

5、題目:

在一個長度為n的數組裡的所有數字都在0到n-1的範圍内。 數組中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出數組中任意一個重複的數字。 例如,如果輸入長度為7的數組{2,3,1,0,2,5,3},那麼對應的輸出是重複的數字2或者3。

6、題目:

LL今天心情特别好,因為他去買了一副撲克牌,發現裡面居然有2個大王,2個小王(一副牌原本是54張) 他随機從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!!“紅心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是順子.....LL不高興了,他想了想,決定大\小 王可以看成任何數字,并且A看作1,J為11,Q為12,K為13。上面的5張牌就可以變成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL決定去買體育彩票啦。 現在,要求你使用這幅牌模拟上面的過程,然後告訴我們LL的運氣如何。為了友善起見,你可以認為大小王是0。

7、題目:

彙編語言中有一種移位指令叫做循環左移(ROL),現在有個簡單的任務,就是用字元串模拟這個指令的運算結果。對于一個給定的字元序列S,請你把其循環左移K位後的序列輸出。例如,字元序列S=”abcXYZdef”,要求輸出循環左移3位後的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它!

8、題目:

牛客最近來了一個新員工Fish,每天早晨總是會拿着一本英文雜志,寫些句子在本子上。同僚Cat對Fish寫的内容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這家夥原來把句子單詞的順序翻轉了,正确的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?

9、題目:

給定一個數組和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入數組{2,3,4,2,6,2,5,1}及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分别為{4,4,6,6,6,5}; 針對數組{2,3,4,2,6,2,5,1}的滑動視窗有以下6個: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

10、題目:

每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。HF作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的:首先,讓小朋友們圍成一個大圈。然後,他随機指定一個數m,讓編号為0的小朋友開始報數。每次喊到m-1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮物,并且不再回到圈中,從他的下一個小朋友開始,繼續0...m-1報數....這樣下去....直到剩下最後一個小朋友,可以不用表演,并且拿到牛客名貴的“名偵探柯南”典藏版(名額有限哦!!^_^)。請你試着想下,哪個小朋友會得到這份禮品呢?(注:小朋友的編号是從0到n-1)

11、題目:

請實作一個函數按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

12、題目:

從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。

13、題目:

如何得到一個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位于中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。

14、題目:

小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正确答案是100。但是他并不滿足于此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列? Good Luck!

輸出描述:

輸出所有和為S的連續正數序列。序列内按照從小至大的順序,序列間按照開始數字從小到大的順序

15、題目:

有一副由NxN矩陣表示的圖像,這裡每個像素用一個int表示,請編寫一個算法,在不占用額外記憶體空間的情況下(即不使用緩存矩陣),将圖像順時針旋轉90度。

給定一個NxN的矩陣,和矩陣的階數N,請傳回旋轉後的NxN矩陣,保證N小于等于500,圖像元素小于等于256。

測試樣例:

[[1,2,3],[4,5,6],[7,8,9]],3傳回:[[7,4,1],[8,5,2],[9,6,3]]           

複制

16、題目:

假定我們都知道非常高效的算法來檢查一個單詞是否為其他字元串的子串。請将這個算法編寫成一個函數,給定兩個字元串s1和s2,請編寫代碼檢查s2是否為s1旋轉而成,要求隻能調用一次檢查子串的函數。

給定兩個字元串s1,s2,請傳回bool值代表s2是否由s1旋轉而成。字元串中字元為英文字母和空格,區分大小寫,字元串長度小于等于1000。

測試樣例:

"Hello world","worldhello "傳回:false"waterbottle","erbottlewat"傳回:true           

複制

17、題目:

輸入一個連結清單,輸出該連結清單中倒數第k個結點。

18、題目:

實作一個算法,删除單向連結清單中間的某個結點,假定你隻能通路該結點。

給定帶删除的節點,請執行删除操作,若該節點為尾節點,傳回false,否則傳回true

19、題目:

編寫代碼,以給定值x為基準将連結清單分割成兩部分,所有小于x的結點排在大于或等于x的結點之前

給定一個連結清單的頭指針 ListNode* pHead,請傳回重新排列後的連結清單的頭指針。注意:分割以後保持原來的資料順序不變。

20、題目:

有兩個用連結清單表示的整數,每個結點包含一個數位。這些數位是反向存放的,也就是個位排在連結清單的首部。編寫函數對這兩個整數求和,并用連結清單形式傳回結果。

給定兩個連結清單ListNode* A,ListNode* B,請傳回A+B的結果(ListNode*)。

測試樣例:

{1,2,3},{3,2,1}傳回:{4,4,4}           

複制

21、題目:

輸入一個連結清單,反轉連結清單後,輸對外連結表的所有元素。

22、題目:

請編寫一個函數,檢查連結清單是否為回文。

給定一個連結清單ListNode* pHead,請傳回一個bool,代表連結清單是否為回文。

測試樣例:

{1,2,3,2,1}傳回:true{1,2,3,2,3}傳回:false           

複制

23、題目:

用兩個棧來實作一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。

24、題目:

有一些數的素因子隻有3、5、7,請設計一個算法,找出其中的第k個數。

給定一個數int k,請傳回第k個數。保證k小于等于100。

測試樣例:

3傳回:7           

複制

25、題目:

現在我們有一個int數組,請你找出數組中每個元素的下一個比它大的元素。

給定一個int數組A及數組的大小n,請傳回一個int數組,代表每個元素比他大的下一個元素,若不存在則為-1。保證數組中元素均為正整數。

測試樣例:

[11,13,10,5,12,21,3],7傳回:[13,21,12,12,21,-1,-1]           

複制

26、題目:

現在有一個數組,請找出數組中每個元素的後面比它大的最小的元素,若不存在則為-1。

給定一個int數組A及數組的大小n,請傳回每個元素所求的值組成的數組。保證A中元素為正整數,且n小于等于1000。

測試樣例:

[11,13,10,5,12,21,3],7[12,21,12,12,21,-1,-1]           

複制

27、題目:

請編寫一個程式,按升序對棧進行排序(即最大元素位于棧頂),要求最多隻能使用一個額外的棧存放臨時資料,但不得将元素複制到别的資料結構中。

給定一個int[] numbers(C++中為vector&ltint>),其中第一個元素為棧頂,請傳回排序後的棧。請注意這是一個棧,意味着排序過程中你隻能通路到第一個元素。

測試樣例:

[1,2,3,4,5]傳回:[5,4,3,2,1]           

複制

28、題目:

實作一個函數,檢查二叉樹是否平衡,平衡的定義如下,對于樹中的任意一個結點,其兩顆子樹的高度差不超過1。

給定指向樹根結點的指針TreeNode* root,請傳回一個bool,代表這棵樹是否平衡。

29、題目:

對于一個有向圖,請實作一個算法,找出兩點之間是否存在一條路徑。

給定圖中的兩個結點的指針UndirectedGraphNode* a,UndirectedGraphNode*b(請不要在意資料類型,圖是有向圖),請傳回一個bool,代表兩點之間是否存在一條路徑(a到b或b到a)。

30、題目:

對于一個元素各不相同且按升序排列的有序序列,請編寫一個算法,建立一棵高度最小的二叉查找樹。

給定一個有序序列int[] vals,請傳回建立的二叉查找樹的高度。

31、題目:

對于一棵二叉樹,請設計一個算法,建立含有某一深度上所有結點的連結清單。

給定二叉樹的根結點指針TreeNode* root,以及連結清單上結點的深度,請傳回一個連結清單ListNode,代表該深度上所有結點的值,請按樹上從左往右的順序連結,保證深度不超過樹的高度,樹上結點的值為非負整數且不超過100000。

32、題目:

請實作一個函數,檢查一棵二叉樹是否為二叉查找樹。

給定樹的根結點指針TreeNode* root,請傳回一個bool,代表該樹是否為二叉查找樹。

33、題目:

請設計一個算法,尋找二叉樹中指定結點的下一個結點(即中序周遊的後繼)。

給定樹的根結點指針TreeNode* root和結點的值intp,請傳回值為p的結點的後繼結點的值。保證結點的值大于等于零小于等于100000且沒有重複值,若不存在後繼傳回-1。

34、題目:

請設計一個算法,計算n的階乘有多少個尾随零。

給定一個int n,請傳回n的階乘的尾零個數。保證n為正整數。

測試樣例:

5傳回:1           

複制

35、題目:

有一棵無窮大的滿二叉樹,其結點按根結點一層一層地從左往右依次編号,根結點編号為1。現在有兩個結點a,b。請設計一個算法,求出a和b點的最近公共祖先的編号。

給定兩個int a,b。為給定結點的編号。請傳回a和b的最近公共祖先的編号。注意這裡結點本身也可認為是其祖先。

2,3傳回:1           

複制

36、題目:

輸入一顆二叉樹和一個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。

37、題目:

有兩個32位整數n和m,請編寫算法将m的二進制數位插入到n的二進制的第j到第i位,其中二進制的位數從低位數到高位且以0開始。

給定兩個數int n和int m,同時給定int j和int i,意義如題所述,請傳回操作後的數,保證n的第j到第i位均為零,且m的二進制位數小于等于i-j+1。

測試樣例:

1024,19,2,6傳回:1100           

複制

38、題目:

有一個介于0和1之間的實數,類型為double,傳回它的二進制表示。如果該數字無法精确地用32位以内的二進制表示,傳回“Error”。

給定一個double num,表示0到1的實數,請傳回一個string,代表該數的二進制表示或者“Error”。

測試樣例:

0.625傳回:0.101           

複制

39、題目:

有一個正整數,請找出其二進制表示中1的個數相同、且大小最接近的那兩個數。(一個略大,一個略小)

給定正整數int x,請傳回一個vector,代表所求的兩個數(小的在前)。保證答案存在。

測試樣例:

2傳回:[1,4]           

複制

40、題目:

編寫一個函數,确定需要改變幾個位,才能将整數A轉變成整數B。

給定兩個整數int A,int B。請傳回需要改變的數位個數。

測試樣例:

10,5傳回:4           

複制

41、題目:

請編寫程式交換一個數的二進制的奇數位和偶數位。(使用越少的指令越好)

給定一個int x,請傳回交換後的數int。

測試樣例:

10傳回:5           

複制

42、題目:

有一個排過序的字元串數組,但是其中有插入了一些空字元串,請設計一個算法,找出給定字元串的位置。算法的查找部分的複雜度應該為log級别。

給定一個string數組str,同時給定數組大小n和需要查找的string x,請傳回該串的位置(位置從零開始)。

測試樣例:

["a","b","","c","","d"],6,"c"傳回:3           

複制

43、題目:

有一個NxM的整數矩陣,矩陣的行和列都是從小到大有序的。請設計一個高效的查找算法,查找矩陣中元素x的位置。

給定一個int有序矩陣mat,同時給定矩陣的大小n和m以及需要查找的元素x,請傳回一個二進制數組,代表該元素的行号和列号(均從零開始)。保證元素互異。

測試樣例:

[[1,2,3],[4,5,6]],2,3,6傳回:[1,2]           

複制