程序員編程藝術第一~三十八章集錦與總結,及Github地址、PDF下載

程序員編程藝術第1~38章集錦與總結,及Github、PDF下載


前言

    熟悉本blog的朋友大都知道,在2010年剛開始寫本博客之際,我整理過一個微軟面試100題,後來我爲這100題開始發帖討論,寫答案上傳,至今成了一個系列,即爲微軟面試100題系列。在整理這個系列的過程當中,越來越強烈的感覺到,可以從那100題中精選一些更爲典型的題,每一題詳細闡述成章,不斷優化,於此,便成了程序員編程藝術系列。

    本編程藝術系列從2011年4月至今,寫了37個編程問題,通過整理每一年校招的筆試面試題,我們都能發現,許多筆試面試題都是來自此編程藝術系列,從而發覺絕大部分問題,都是有規律可循的,而且可以不斷優化。

    然個人力量有限,故特意把這37個問題集中到一起,你可以做兩件事情:

  1. 發現本編程藝術系列任何問題、錯誤、bug,或可以優化的每一段代碼,歡迎隨時批評指正;
  2. 歡迎你也來做做這37題,不看答案,自己寫自己的代碼,一起刷這37題。

    反饋方式可以多樣,如:

    願我們能共同享受編程和思考的樂趣,thanks。


程序員編程藝術第一~三十七章集錦

1題、定義字符串的左旋轉操作:把字符串前面的若干個字符移動到字符串的尾部,如把字符串abcdef左旋轉2位得到字符串cdefab。
請實現字符串左旋轉的函數,要求對長度爲n的字符串操作的時間複雜度爲O(n),空間複雜度爲O(1)。 

2題、假設這有一個各種字母組成的字符串A,和另外一個字符串B,字符串裏B的字母數相對少一些。什麼方法能最快的查出所有小字符串B裏的字母在大字符串A裏都有?

比如,如果是下面兩個字符串:
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)。如果有多對數字的和等於輸入的數字,輸出任意一對即可。
例如輸入數組1、2、4、7、11、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題、對倒排索引中的關鍵詞進行編碼。那麼,這個問題將分爲兩個個步驟:
  1. 首先,要提取倒排索引內詞典文件中的關鍵詞;
  2. 對提取出來的關鍵詞進行編碼。

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數組中,多個匹配項用空格間隔,最後一個不需要空格。

要求:

  1. 匹配規則中包含通配符?和*,其中?表示匹配任意一個字符,*表示匹配任意多個(>=0)字符。
  2. 匹配規則要求匹配最大的字符子串,例如a*d,匹配abbdd而非abbd,即最大匹配子串。
  3. 匹配後的輸入串不再進行匹配,從當前匹配後的字符串重新匹配其他字符串。

請實現函數: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了: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、二零一三年十二月十三日。

發佈了166 篇原創文章 · 獲贊 1萬+ · 訪問量 1604萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章