在上一篇博客中有原有提到分享一下面試題,最近也是才能新公司入職沒多久,忙着熟悉環境,加上前不久出去玩了一趟(順便寫了篇游記,感興趣的可以看一看)。所以一直沒時間整理博客,這段時間周末終於閑下來,就趁着周末就記錄了幾個面試過程中碰到的算法題。
本篇博客不打算介紹那些高逼格的算法(如winnow,bagging,ada boost等等),就講講最近在面試過程中遇到的算法題以及面試的時候給出的答案(出場率比較高的算法題我都列出來了,其他的就不說了)。算法可以說是解決所有問題的基石。很多東西都可以轉換為算法問題,學習算法最大的作用就是更清楚地了解了很多東西。正所謂是,知其然更知其所以然。很多人都覺得程序就是數據結構+算法+適當的注釋。不學算法,那就不要學編程了。雖然說可能沒這么誇張,因為實際上還是有很多小項目是不需要太多算法的,都是代碼一個勁的往上疊加就行了。但是就算沒那么誇張,但是作為一個程序員,邏輯思維就是算法的思路還是很重要的。---這段話是某公司一個面試官說的。
v寫在前面
再次重申一下,這里只是列出一些最近遇到的算法面試題,拿出來給大家分享一下面試經歷(僅是常見算法方面的經歷,還有一些不常見的就懶得列舉了,技術方向的不介紹)。還有就是我的答案。ps:無論是算法題還是答案都不具任何代表性也並非是正確答案,僅僅是我面試的時候給出的答案,只是分享而已。另外,對於我所列出的問題以及給出的答案,如果有園友有疑議或者是更好的解決辦法,那就分享出來! 寫算法是一個非常過癮的享受!
順便說一嘴,因為有一次面試面試官是在倫敦,所以只能遠程面試,我們是用collabedit,這個東東還是很受用的。
v算法百科
----算法百科摘自百度百科(ps:不摘點介紹性的文字在這,直接開門見山的來題目。感覺有點duangduang的。性急的可以直接跳過此處!)
算法(Algorithm)是指解題方案的准確而完整的描述,是一系列解決問題的清晰指令,算法代表着用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。如果一個算法有缺陷,或不適合於某個問題,執行這個算法將不會解決這個問題。不同的算法可能用不同的時間、空間或效率來完成同樣的任務。一個算法的優劣可以用空間復雜度與時間復雜度來衡量。 算法中的指令描述的是一個計算,當其運行時能從一個初始狀態和(可能為空的)初始輸入開始,經過一系列有限而清晰定義的狀態,最終產生輸出並停止於一個終態。一個狀態到另一個狀態的轉移不一定是確定的。隨機化算法在內的一些算法,包含了一些隨機輸入。 形式化算法的概念部分源自嘗試解決希爾伯特提出的判定問題,並在其后嘗試定義有效計算性或者有效方法中成形。這些嘗試包括庫爾特·哥德爾、Jacques Herbrand和斯蒂芬·科爾·克萊尼分別於1930年、1934年和1935年提出的遞歸函數,阿隆佐·邱奇於1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾倫·圖靈1937年提出的圖靈機。即使在當前,依然常有直覺想法難以定義為形式化算法的情況。
v算法題目
- 第一題:在一個已經排序的Int數組中,查找某個number,如果存在這個number,返回在數組的位置,反之返回-1 查看博主面試答案
- 第二題:{"12,bob","3,sky","6,cool","1,good","22,go"},按元素第一列排序 查看博主面試答案
- 第三題:字符串數組去除重復項 查看博主面試答案
- 第四題:將一個未排序的整形數組進行歸置,數組中的負數移動到數組的左邊,正數移動到數組的右邊。0不動(ps:我一開做這題就打算用無腦排序搞定,結果我才開始寫,面試官就說了"這里需要提示一下,移動后的數組只是負數在左,正數在右。不一定非要用傳統的排序,如果不是傳統的排序可以加分。") 查看博主面試答案
所有答案僅供參考,並非標准或者正確答案,只是在面試的時候給出的答案而已,所以歡迎大家給出更好的答案
所有答案都是面試的時候notepad寫的,回來以后我沒有double check,直接貼出了代碼,其中有一部分我后面附加了圖。如果大家有興趣,我也建議大家可以先用notepad寫寫看,因為算法這種東西本身就是一個思路而已。沒必要用vs。
v參考答案
第一題
//------------------------------------------------------------------------------ // <copyright file="Runner.cs" company="CNBlogs Corporation" owner="請叫我頭頭哥"> // Copyright (C) 2015-2016 All Rights Reserved // 原博文地址: http://www.cnblogs.com/toutou/ // </copyright> //------------------------------------------------------------------------------ namespace TestApp { using System; using System.Collections.Generic; using System.Text.RegularExpressions; class Runner { static void Main(string[] args) { int[] arr = { 3, 5, 6, 7, 8, 9, 14, 23, 45, 56, 63, 72, 87, 91, 92, 93, 95, 97, 98, 534, 555, 676, 878, 988, 1365 }; int number = 555; int result = Search(arr, number); Console.WriteLine(result); Console.ReadKey(); } public static int Search(int[] arr, int number) { int result = 0; if (arr == null || arr.Length == 0 || number > arr[arr.Length - 1] || number < arr[0]) { result = -1; } else { result = Bisearch(arr.Length - 1, arr, number); } return result; } public static int Bisearch(int endIndex, int[] arr, int number, int startIndex = 0) { int result = 0; if ((endIndex - startIndex) < 2) { for (int i = startIndex; i <= endIndex; i++) { if (arr[i] == number) { result = i; break; } else { result = -1; } } } else { if (arr[startIndex] <= number && number <= arr[(endIndex + startIndex) / 2]) { Bisearch((endIndex + startIndex) / 2, arr, number, startIndex); } else { Bisearch(endIndex, arr, number, (endIndex + startIndex) / 2 + 1); } } return result; } } }
第二題
namespace TestApp { using System; using System.Text.RegularExpressions; class Program { static void Main(string[] args) { string[] source = new string[] { "12,bob", "3,sky", "6,cool", "1,good", "22,go" }; for (int i = 0; i < source.Length; i++) { for (int j = i; j < source.Length; j++) { if (Convert.ToInt32(Regex.Match(source[i], @"\d+").Value) > Convert.ToInt32(Regex.Match(source[j], @"\d+").Value)) { string temp = source[i]; source[i] = source[j]; source[j] = temp; } } } for (int i = 0; i < source.Length; i++) { Console.WriteLine(source[i]); } } } }
第三題
namespace TestApp { using System; class Program { static void Main(string[] args) { string[] source = { "aaa", "bbb", "aaa", "ccc", "bbb", "ddadd", "ccc", "aaa", "bbb", "ddd" }; foreach (var item in ArrDistinct(source)) { Console.WriteLine(item); } } public static String[] ArrDistinct(string[] source) { if (source != null && source.Length > 0) { Array.Sort(source); int size = 1; for (int i = 1; i < source.Length; i++) if (source[i] != source[i - 1]) size++; string[] tempArr = new string[size]; int j = 0; tempArr[j++] = source[0]; for (int i = 1; i < source.Length; i++) if (source[i] != source[i - 1]) tempArr[j++] = source[i]; return tempArr; } return source; } } }
//因為這題的主要考點在字符串數組去重,所以排序我就沒太在意,直接用的系統排序。當然,這樣是很不專業的。不過如果有必要的話,這里也可以先用算法排序字符串,然后再用我這個辦法。 至於算法排序字符串,我能想到的比較"卑鄙"的辦法就只有先將字符串數組轉成char再轉成int數組, Array.ConvertAll<string, int>(strArray, s => int.Parse(s)); //再排序,大神你有更好的辦法?有就不要藏着掖着了,來吧!
第四題
public int[] IntArrSort(int[] source) { if (source == null || source.Length == 0) return source; int rightIndex = source.Length - 1, tempNumber = 0; for (int i = 0; i < source.Length; i++) { if (i > rightIndex) break; if (source[i] <= 0) { continue; } else if (source[i] > 0) { for (int j = rightIndex; j >= 0; j--) { if (source[j] < 0) { tempNumber = source[j]; source[j] = source[i]; source[i] = tempNumber; rightIndex = j; break; } } } } return source; }
v博客總結
各位道友,以上所有的算法面試題都是我平常在面試中積累下來的,出場率比較高的我都列出來了(出場率只是相對我面試的經歷而言)。
另外:特別說明一下,我給出的算法面試題答案可能也有錯誤的,只是給出我的參考意見,算法這種東西本身就沒有什么標准答案可言,而且可能有些題目我的思路或者解題方式也不一樣對。歡迎各位道友給出更好的答案或者解題思路,共同進步!
作 者:請叫我頭頭哥
出 處:http://www.cnblogs.com/toutou/
關於作者:專注於基礎平台的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回復。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!
