兩本趣味算法書

 

1、枕邊算法書

枕邊算法書》是一本關於算法的數,此書讀起來比較輕鬆,可以一口氣讀完。但內容卻很豐富,不少方面都觸及到了,下面簡單記錄該書的關鍵內容。程序員

1.2 邏輯推理題算法

1.3 數據結構 二叉樹 字符串 遞歸編程

1.5 尋找BUG 邏輯思惟 防護型編程數組

1.6 對事業的熱情和執着 全身投入的專業精神 團結與配合數據結構

1.7 迴文 196算法(迴文數值問題)函數

1.8 康威的末日算法(根據日期猜星期幾) 能被100和400整除的年份就是閏年性能



2.1 排序算法 分治遞歸優化內存 快速排序 理解以後再懷疑優化

2.2 搜索 二分檢索加密

2.3 動態規劃 斐波那契數列 將計算過的結果保存到列表的存儲單元中spa

2.4 散列(Hash)給定鍵值查找保存的數據

2.5 Soundex算法 遵循4個規則

2.6 梅森素數 素數p中2^p-1也是素數

2.8 文學編程 代碼書寫端正,理論要精密,性能要有效率,概念要具有首創性



3.1 歐幾里得算法 最大公約數

3.2 遞歸 調用函數時會把函數地址保存到系統內部的棧,須要知道應當返回的位置 尾遞歸

3.3 RSA算法 公鑰和私鑰

3.5 單鏈表 杯中水超過一半仍是不到一半 內存泄露

3.6 RSA加密過程

3.7 塗鴉代碼 波蘭式 棧和隊列



4.1 N皇后問題 回溯法(backtracking)

4.3 沒法重現一帶而過

4.5 Jeff Somers的皇后算法 不肯閱讀別人代碼很難成爲優秀程序員

4.6 位運算 位至關於構成水和空氣的粒子 按位與 按位或 按位異或 左移 右移 取反

4.7 二進制補碼 以1開頭的表示負數

4.8 分析Jeff Somers算法 刪除註釋,對剩下的if、while、for等可以調節邏輯流程的部分進行探究 20%的代碼影響80%的性能

 

2、編程之美

在《編程之美》中收集了約60道算法和程序設計題目,做者試圖從書中各類有趣的問題出發,引導讀者發現問題,分析問題,解決問題,尋找更優的解法。下面簡單記錄該書的關鍵內容。

第二章

1. 統計二進制中1的個數,解法一是不斷地除以2,解法二是向右移位,解法三N和N-1之間的與運算,解法四預約義結果查表

2. 計算N的階乘N!末尾0的個數,解法一統計因式分解5的個數。N!二進制中表示最低位1的位置,質因數2的個數:N/2+N/4+N/8+...

3. 尋找發帖水王,避免使用排序,每次刪除兩個不一樣的ID,在剩下的ID列表中水王的ID仍然超過總數的一半。

4. 從1到N,統計1出現的個數,用推倒,有兩種方法

5. 尋找最大的K個數,第一種是相似於快速排序分紅兩組,第二種是同二分搜索找第K大的數,第三種是用最小堆,堆頂就是第K個數中最小的一個,第四種申請空間,把整數做爲數組下標,記錄每一個整數出現的次數

6. 精確表達浮點數,有個遞推公式:((a1a2...an)*(10^m-1)+(b1b2...bn))/((10^m-1)*10^n)

7. 最大公約數,展轉相除法f(x, y)=f(y, y%x),直到其中一個數爲0,另外一種方法是f(x, y)=f(x-y, y),還有一種是用移位運算。

8. 找符合條件的整數

9. 斐波那契數列,用數組儲存全部已計算過的項,求解通項公式。

10. 尋找數組中的最大值和最小值,首先將數組中相鄰的數分在同一組,而後利用兩個變量max和min與同一組的兩個數比較,較大的數賦給max,較小的數賦給min,時間複雜度O(1.5*N)。

11. 尋找最近點,先讓數組有序,而後找最小差值只須要O(N)的時間,總時間複雜度是O(N*logN)

12. 快速尋找知足條件的兩個數,使得這兩個數之和等於一個給定的數字,先排序,而後在一個循環體裏利用兩個變量進行反向的遍歷,從而保證遍歷算法的時間複雜度是O(n)。

13. 子數組的最大乘積,正數、負數和0

14. 求子數組之和的最大值,解法一雙層for循環枚舉,解法二用分治算法把數組分爲兩段,

15. 求子數組之和的最大值(二維)

16. 找出數組中最長遞增子序列的長度,解法一根據無後效性定義使用動態規劃來解決,若是arr[i+1]大於arr[k],那麼能夠接在最長子序列L[k]以後,解法二記錄遞增子序列中最大元素的最小值。

17. 數組循環K位,時間複雜度爲O(N),解法一考慮循環右移的特色:K=K%N,解法二將數組分紅兩個總體,最後交換一下。

18. 將數組分紅兩個長度爲n的數組,而且數組之和最接近。

19. 區間重合判斷,解法一將源區間和目標區間投影到座標軸上,解法二把數組預處理(合併、排序等),將無序數組轉化成一個目標區間,再用二分查找斷定。

20. 程序理解和時間分析

 

第三章

1. 一個字符串經過移位能包含另外一個字符串,解法一利用循環移位,解法二移位獲得的字符串是第一個字符串對自身拼接後的字符串。

2. 電話號碼對應英語單詞,將字母轉換成一棵樹,使用直接循環法和遞歸法。

3. 計算字符串的類似程度

4. 從無頭單鏈表中刪除節點,單鏈表的狸貓換太子,先把C的內容賦給B,而後再刪除C。

5. 最短摘要的生成

6. 判斷兩個鏈表是否相交,解法一將第一個鏈表的節點地址進行hash排序,創建hash表,而後用第二個鏈表查詢hash表,解法二把第二個鏈表接在第一個鏈表以後,再判斷是否有環,解法三判斷兩個鏈表的最後一個節點

7. 在隊列中取最大值,解法一維護最大堆,解法二保存隊列中元素相對大小關係的指針集合

8. 求二叉樹中節點的最大距離

9. 重建二叉樹

10. 分層遍歷二叉樹

 

第四章

1. 計算坐到本身原位置的機率

2. 用1*2的瓷磚覆蓋N*M的地板

3. 買票找零,轉化爲括號匹配

4. 點在三角形內,解法一用海倫公式(三斜求積數)算四個三角形的面積,解法二沿着三條邊逆時針旋轉點D,點D必定在邊的左邊

5. 磁帶文件存放優化

6. 桶中只留下一個黑球的機率

7. 螞蟻離開木杆的最短和最長時間

8. 輸入三條邊,判斷可否構成三角形

9. 數獨,每一行每一列都沒有重複的數字

10. 數字啞謎和迴文,問題1剪枝法和羅列整除的條件

11. 挖到雷的機率

相關文章
相關標籤/搜索