程序員編程藝術第1~38章集錦與總結,及Github、PDF下載
前言
熟悉本blog的朋友大都知道,在2010年剛開始寫本博客之際,我整理過一個微軟面試100題,後來我爲這100題開始發帖討論,寫答案上傳,至今成了一個系列,即爲微軟面試100題系列。在整理這個系列的過程當中,越來越強烈的感覺到,可以從那100題中精選一些更爲典型的題,每一題詳細闡述成章,不斷優化,於此,便成了程序員編程藝術系列。
本編程藝術系列從2011年4月至今,寫了37個編程問題,通過整理每一年校招的筆試面試題,我們都能發現,許多筆試面試題都是來自此編程藝術系列,從而發覺絕大部分問題,都是有規律可循的,而且可以不斷優化。
然個人力量有限,故特意把這37個問題集中到一起,你可以做兩件事情:
- 發現本編程藝術系列任何問題、錯誤、bug,或可以優化的每一段代碼,歡迎隨時批評指正;
- 歡迎你也來做做這37題,不看答案,自己寫自己的代碼,一起刷這37題。
反饋方式可以多樣,如:
- 你可以直接在本博客上留言show出你的思路和代碼,
- 也可以貢獻到程序員編程藝術的github上:https://github.com/julycoding/The-Art-Of-Programming_by-July,
- 或微博@研究者July 私信我。
程序員編程藝術第一~三十七章集錦
請實現字符串左旋轉的函數,要求對長度爲n的字符串操作的時間複雜度爲O(n),空間複雜度爲O(1)。
比如,如果是下面兩個字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPO
答案是true,所有在string2裏的字母string1也都有。
如果是下面兩個字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPZ
答案是false,因爲第二個字符串裏的Z字母不在第一個字符串裏。
假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。一個查詢串的重複度越高,說明查詢它的用戶越多,也就是越熱門。),請你統計最熱門的10個查詢串,要求使用的內存不能超過1G。
第4題、給定一個字符串A,要求在A中查找一個子串B。如A="ABCDF",要你在A中查找子串B=“CD”,相當於實現strstr庫函數。
例如輸入數組1、2、4、7、11、15和數字15。由於4+11=15,因此輸出4和11。
如果兩個數a和b,a的所有真因數之和等於b,b的所有真因數之和等於a,則稱a,b是一對親和數。例如220和284,1184和1210,2620和2924。
第7題、輸入一個整形數組,數組裏有正數也有負數。數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。求所有子數組的和的最大值。要求時間複雜度爲O(n)。
例如輸入的數組爲1, -2, 3, 10, -4, 7, 2, -5,和最大的子數組爲3, 10, -4, 7, 2,因此輸出爲該子數組的和18。
指令系統:只包含4條指令,向左、向右、條件判定、無條件跳轉。其中向左(右)指令每次能控制機器人向左(右)移動一步;條件判定指令能對機器人所在的位置進行條件測試,測試結果是如果對方機器人曾經到過這裏就返回true,否則返回false;無條件跳轉,類似彙編裏面的跳轉,可以跳轉到任何地方。
輸出:得到按從小到大升序排列的包含所有輸入的整數的列表。
條件:最多有大約1MB的內存空間可用,但磁盤空間足夠。且要求運行時間在5分鐘以下,10秒爲最佳結果。
第11題、什麼是最長公共子序列呢?好比一個數列 S,如果分別是兩個或多個已知數列的子序列,且是所有符合此條件序列中最長的,則S 稱爲已知序列的最長公共子序列。
舉個例子,如:有兩條隨機序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,則它們的最長公共子序列便是:4 5 5。
abc、acb、bac、bca、cab 和cba。
String extractSummary(String description,String[] key words)
目標是找出此產品描述中包含N個關鍵字(每個關鍵詞至少出現一次)的長度最短的子串,作爲產品簡介輸出。
例如下面的二維數組就是每行、每列都遞增排序。如果在這個數組中查找數字6,則返回true;如果查找數字5,由於數組不含有該數字,則返回false。
第24題、對倒排索引中的關鍵詞進行編碼。那麼,這個問題將分爲兩個個步驟:
- 首先,要提取倒排索引內詞典文件中的關鍵詞;
- 對提取出來的關鍵詞進行編碼。
1.在給定位置上插入一個字符
2.替換任意字符
3.刪除任意字符
寫一個程序,返回最小操作數,使得對源串進行這些操作後等於目標串,源串和目標串的長度都小於2000。
給定函數原型int StrToInt(const char *str) ,完成函數StrToInt,實現字符串轉換成整數的功能,不得用庫函數atoi
第31題、字符串匹配問題,給定一串字符串,按照指定規則對其進行匹配,並將匹配的結果保存至output數組中,多個匹配項用空格間隔,最後一個不需要空格。
要求:
- 匹配規則中包含通配符?和*,其中?表示匹配任意一個字符,*表示匹配任意多個(>=0)字符。
- 匹配規則要求匹配最大的字符子串,例如a*d,匹配abbdd而非abbd,即最大匹配子串。
- 匹配後的輸入串不再進行匹配,從當前匹配後的字符串重新匹配其他字符串。
請實現函數:char* my_find(char input[], char rule[])
第32題、給定一個單詞集合Dict,其中每個單詞的長度都相同。現從此單詞集合Dict中抽取兩個單詞A、B,我們希望通過若干次操作把單詞A變成單詞B,每次操作可以改變單詞的一個字母,同時,新產生的單詞必須是在給定的單詞集合Dict中。求所有行得通步數最少的修改方法。
舉個例子如下:Given:
A = "hit"
B = "cog"
Dict = ["hot","dot","dog","lot","log"]
Return
[
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]
]
即把字符串A = "hit"轉變成字符串B = "cog",有以下兩種可能:
"hit" -> "hot" -> "dot" -> "dog" -> "cog";第33題、用 1×1×1, 1× 2×1以及2×1×1的三種木塊(橫綠豎藍,且綠藍長度均爲2),"hit" -> "hot" -> "lot" -> "log" ->"cog"。
搭建高長寬分別爲K × 2^N × 1的牆,不能翻轉、旋轉(其中,0<=N<=1024,1<=K<=4)
有多少種方案,輸出結果對1000000007取模。
舉個例子如給定高度和長度:N=1 K=2,則答案是7,即有7種搭法,如下圖所示:
第35題、有個長度爲2n的數組{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序後{a1,b1,a2,b2,....,an,bn},請考慮有無時間複雜度o(n),空間複雜度0(1)的解法。
第37題、找一個點集中與給定點距離最近的點,同時,給定的二維點集都是固定的,查詢可能有很多次,時間複雜度O(n)無法接受,請設計數據結構和相應的算法。
第38題、Hero在線編程判題、出題系統的演進與優化
如果某一天打開瀏覽器,便能在網頁上直接敲代碼,那該有多好,隨時隨地,不受編譯器限制。好事多磨,今年3月終於來CSDN來做這樣一個在線編程網站Hero了:http://hero.csdn.net/,以項目負責人的身份總體負責它的產品和運營、包括出題。
PDF免積分下載
歡迎大家先不看我的答案,自己做自己的,可把你的答案直接評論於本篇或原來每一篇下,或集體發到程序員編程藝術的github上:https://github.com/julycoding/The-Art-Of-Programming_by-July 上,talk is cheap,show me your code!當然,如若發現原系列有任何問題,歡迎隨時向我反饋,感謝。
最後,分享出程序員編程藝術第1~37章帶標籤的最新PDF的下載地址(3天3000人下載):http://download.csdn.net/detail/v_july_v/6694053,供你做完後參考。
July、二零一三年十二月十三日。