《枕边算法书》是一本关于算法的数,此书读起来比较轻松,可以一口气读完。但内容却很丰富,不少方面都触及到了,下面简单记录该书的关键内容。程序员
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%的性能
在《编程之美》中收集了约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. 挖到雷的几率