程序員編程藝術第1~38章集錦與總結,及Github、PDF下載
\html
熟悉本blog的朋友大都知道,在2010年剛開始寫本博客之際,我整理過一個微軟面試100題,後來我爲這100題開始發帖討論,寫答案上傳,至今成了一個系列,即爲微軟面試100題系列。在整理這個系列的過程中,愈來愈強烈的感受到,能夠從那100題中精選一些更爲典型的題,每一題詳細闡述成章,不斷優化,於此,便成了程序員編程藝術系列。git
本編程藝術系列從2011年4月至今,寫了37個編程問題,經過整理每年校招的筆試面試題,咱們都能發現,許多筆試面試題都是來自此編程藝術系列,從而發覺絕大部分問題,都是有規律可循的,並且能夠不斷優化。程序員
然我的力量有限,故特地把這37個問題集中到一塊兒,你能夠作兩件事情:github
反饋方式能夠多樣,如:面試
願咱們能共同享受編程和思考的樂趣,thanks。算法
\編程
第1題、 定義字符串的左旋轉操做:把字符串前面的若干個字符移動到字符串的尾部,如把字符串abcdef左旋轉2位獲得字符串cdefab。
請實現字符串左旋轉的函數,要求對長度爲n的字符串操做的時間複雜度爲O(n),空間複雜度爲O(1)。 \數組
\瀏覽器
第2題、 假設這有一個各類字母組成的字符串A,和另一個字符串B,字符串裏B的字母數相對少一些。什麼方法能最快的查出全部小字符串B裏的字母在大字符串A裏都有?\markdown
好比,若是是下面兩個字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPO
答案是true,全部在string2裏的字母string1也都有。
若是是下面兩個字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPZ
答案是false,由於第二個字符串裏的Z字母不在第一個字符串裏。
\
第3題、 輸入n個整數,輸出其中最小的k個。例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字爲1,2,3和4。\
\
第3.1題、 搜索引擎會經過日誌文件把用戶每次檢索使用的全部檢索串都記錄下來,每一個查詢串的長度爲1-255字節。
假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但若是除去重複後,不超過3百萬個。一個查詢串的重複度越高,說明查詢它的用戶越多,也就是越熱門。),請你統計最熱門的10個查詢串,要求使用的內存不能超過1G。\
\
\
第3.2題、 給定數組,給定區間,求第K小的數如何處理?\
\
第4題、 給定一個字符串A,要求在A中查找一個子串B。如A="ABCDF",要你在A中查找子串B=「CD」,至關於實現strstr庫函數。
\
第5.1題、 輸入一個數組和一個數字,在數組中查找兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是O(n)。若是有多對數字的和等於輸入的數字,輸出任意一對便可。
例如輸入數組一、二、四、七、十一、15和數字15。因爲4+11=15,所以輸出4和11。\
第5.2題、 編程求解:輸入兩個整數 n 和 m,從數列1,2,3.......n 中 隨意取幾個數,使其和等於 m ,要求將其中全部的可能組合列出來。
\
第6題、 求500萬之內的全部親和數
若是兩個數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。
\
第9題、 在一條左右水平放置的直線軌道上任選兩個點,放置兩個機器人,請用以下指令系統爲機器人設計控制程序,使這兩個機器人可以在直線軌道上相遇。(注意兩個機器人用你寫的同一個程序來控制)
指令系統:只包含4條指令,向左、向右、條件斷定、無條件跳轉。其中向左(右)指令每次能控制機器人向左(右)移動一步;條件斷定指令能對機器人所在的位置進行條件測試,測試結果是若是對方機器人曾經到過這裏就返回true,不然返回false;無條件跳轉,相似彙編裏面的跳轉,能夠跳轉到任何地方。\
\
第10題、 輸入:給定一個文件,裏面最多含有n個不重複的正整數(也就是說可能含有少於n個不重複正整數),且其中每一個數都小於等於n,n=10^7。
輸出:獲得按從小到大升序排列的包含全部輸入的整數的列表。
條件:最多有大約1MB的內存空間可用,但磁盤空間足夠。且要求運行時間在5分鐘如下,10秒爲最佳結果。\
\
第11題、 什麼是最長公共子序列呢?比如一個數列 S,若是分別是兩個或多個已知數列的子序列,且是全部符合此條件序列中最長的,則S 稱爲已知序列的最長公共子序列。
舉個例子,如:有兩條隨機序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,則它們的最長公共子序列即是:4 5 5。
\
第12題、 給40億個不重複的unsignedint的整數,沒排過序的,而後再給一個數,如何快速判斷這個數是否在那40億個數當中?
第13題、 一個文件中含有n個元素,只能遍歷一遍,要求等機率隨機取出其中之一。
第14題、 海量日誌數據,提取出某日訪問百度次數最多的那個IP。
第15題、 判斷一個字串是不是迴文
\
第16題、 輸入一個字符串,打印出該字符串中字符的全部排列。例如輸入字符串abc,則輸出由字符a、b、c 所能排列出來的全部字符串
abc、acb、bac、bca、cab 和cba。
第17題、 一個臺階總共有n 級,若是一次能夠跳1 級,也能夠跳2 級。求總共有多少總跳法,並分析算法的時間複雜度。
第18題、 輸入一個整數數組,調整數組中數字的順序,使得全部奇數位於數組的前半部分,全部偶數位於數組的後半部分。要求時間複雜度爲O(n)。
第19題、 在一個字符串中找到第一個只出現一次的字符。如輸入abaccdeff,則輸出b。
\
第21題、 數組中有一個數字出現的次數超過了數組長度的一半,找出這個數字。
第22題、 給定一段產品的英文描述,包含M個英文字母,每一個英文單詞以空格分隔,無其餘標點符號;再給定N個英文單詞關鍵字,請說明思路並編程實現方法
String extractSummary(String description,String[] key words)
目標是找出此產品描述中包含N個關鍵字(每一個關鍵詞至少出現一次)的長度最短的子串,做爲產品簡介輸出。
\
第23題、 在一個m行n列二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
例以下面的二維數組就是每行、每列都遞增排序。若是在這個數組中查找數字6,則返回true;若是查找數字5,因爲數組不含有該數字,則返回false。\
第24題、 對倒排索引中的關鍵詞進行編碼。那麼,這個問題將分爲兩個個步驟:
\
第25題、 請實現二分查找
\
第27題、 一個未排序整數數組,有正負數,從新排列使負數排在正數前面,而且要求不改變原來的正負數之間相對順序。好比: input: 1,7,-5,9,-12,15 ,ans: -5,-12,1,7,9,15 。且要求時間複雜度O(N),空間O(1) 。
\
第28題、 給一個浮點數序列,取最大乘積連續子串的值,例如 -2.5,4,0,3,0.5,8,-1,則取出的最大乘積連續子串爲3,0.5,8。也就是說,上述數組中,3 0.5 8這3個數的乘積3*0.5*8=12是最大的,並且是連續的。\
第29題、 給定一個源串和目標串,可以對源串進行以下操做:
1.在給定位置上插入一個字符
2.替換任意字符
3.刪除任意字符
寫一個程序,返回最小操做數,使得對源串進行這些操做後等於目標串,源串和目標串的長度都小於2000。
\
第30題、 輸入一個表示整數的字符串,把該字符串轉換成整數並輸出,例如輸入字符串"345",則輸出整數345。
給定函數原型int StrToInt(const char *str) ,完成函數StrToInt,實現字符串轉換成整數的功能,不得用庫函數atoi
第31題、 字符串匹配問題,給定一串字符串,按照指定規則對其進行匹配,並將匹配的結果保存至output數組中,多個匹配項用空格間隔,最後一個不須要空格。
要求:\
請實現函數: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";
"hit" -> "hot" -> "lot" -> "log" ->"cog"。
第33題、 用 1×1×1, 1× 2×1以及2×1×1的 三種木塊(橫綠豎藍,且綠藍長度均爲2),
搭建高長寬分別爲K × 2^N × 1的牆,不能翻轉、旋轉(其中,0<=N<=1024,1<=K<=4)
有多少種方案,輸出結果對1000000007取模。
舉個例子如給定高度和長度:N=1 K=2,則 答案是7,即有7種搭法,以下圖所示:
\
第34題、 有n*n個格子,每一個格子裏有正數或者0,從最左上角往最右下角走,只能向下和向右,一共走兩次(即從左上角走到右下角走兩趟),把全部通過的格子的數加起來,求最大值SUM,且兩次若是通過同一個格子,則最後總和SUM中該格子的計數只加一次。
第35題、 有個長度爲2n的數組{a1,a2,a3,...,an,b1,b2,b3,...,bn},但願排序後{a1,b1,a2,b2,....,an,bn},請考慮有無時間複雜度o(n),空間複雜度0(1)的解法。
\
第36題、 百度搜索框中,輸入「北京」,搜索框下面會以北京爲前綴,展現「北京愛情故事」、「北京公交」、「北京醫院」等等搜索詞,輸入「 結構之 」,會提示「結構之法」,「結構之法 算法之道」等搜索詞。 請問,如何設計此係統,使得空間和時間複雜度儘可能低。
第37題、 找一個點集中與給定點距離最近的點,同時,給定的二維點集都是固定的,查詢可能有不少次,時間複雜度O(n)沒法接受,請設計數據結構和相應的算法。
\
第38題、Hero在線編程判題、出題系統的演進與優化
若是某一天打開瀏覽器,便能在網頁上直接敲代碼,那該有多好,隨時隨地,不受編譯器限制。好事多磨,今年3月終於來CSDN來作這樣一個在線編程網站Hero了:hero.csdn.net/,以項目負責人的身份整體負責它的產品和運營、包括出題。
\
歡迎你們先不看個人答案,本身作本身的,可把你的答案直接評論於本篇或原來每一篇下,或集體發到程序員編程藝術的github上:github.com/julycoding/… 上,talk is cheap,show me your code!固然,如若發現原系列有任何問題,歡迎隨時向我反饋,感謝。
最後,分享出程序員編程藝術第1~37章帶標籤的最新PDF的下載地址(3天3000人下載):download.csdn.net/detail/v_ju…,供你作完後參考。
July、二零一三年十二月十三日。\