一、枕边算法书
《枕边算法书》是一本关于算法的数,此书读起来比较轻松,能够一口气读完。但内容却很丰富,很多方面都触及到了,下面简单记录该书的关键内容。
1.2 逻辑推理题
1.3 数据结构 二叉树 字符串 递归
1.5 寻找BUG 逻辑思维 防御型编程
1.6 对事业的热情和执着 全身投入的专业精神 团结与配合
1.7 回文 196算法(回文数值问题)
1.8 康威的末日算法(根据日期猜星期几) 能被100和400整除的年份就是闰年
2.1 排序算法 分治递归优化内存 快速排序 理解之后再怀疑
2.2 搜索 二分检索
2.3 动态规划 斐波那契数列 将计算过的结果保存到列表的存储单元中
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. 挖到雷的概率