之前看过这本书,花了两天大致又看了一遍。做个笔记。
扩展题大多没做。很多题目还得自己实现一下。 --------- 2013.2.21
游戏之乐 ------------- 游戏的设计是很大的学问,数据结构选择等。
1.1 让cpu占用率曲线听你的指挥
主要就是几个api
1.2 中国象棋将帅问题
只用一个字节存储变量! bitset要掌握,写一遍在对照编程珠玑
掌握规律后的解法很简单。p18
1.3 一摞烙饼的排序
自己的想法是最初始的解法一。
书中p21页给的代码写得非常规范,可以当作范本。使用上下界进行剪枝
1.4 买书问题
p30列 表格的方法非常值得借鉴,有利于启发思路。对于贪心的尝试很有启发意义。
解法二,由于书本的价格都一样,提出了“最小表示”,进行排序后表达,而不管其真正的书本是什么。减少了很多排列情况。很有意义。
有了最小表示之后就可以用p36的动态规划,写出其转移方程。
1.5 快速找出故障机器
XOR!每个出现两次,那么所有出现两次的id的异或为0.而异或满足结合率。所以如果将所有的进行异或,那么结果是只出现一次的那个id。
如果使用hash的方法去查找这个只出现一次的方法,需要很多辅助空间。而且这个方法应该还存在一个问题,对于出现过两次的id进行清空,那么如何知道这个出现id是 否是由于引起的,还是的确是相同的。而且如何从hash表中读出这个id到底是什么?? (要完成以上功能应该用bitset的吧,有一对一关系)
提到这里还要练习用bitset进行排序。已经hash排序。
至于这道题说的把所有id相加,再减去,感觉有点不靠谱。海量数据不好搞吧。不过其最后构造方程组的方法值得参考。
1.6 饮料供货
显然是背包问题。复习背包九讲。
最后的简化方案值得一看。
1.7 光影切割问题
表面上看来很有难度。经过p50页的画图分析之后变成了求线段交点的问题。简单多了。相当于求逆序数。
说起逆序数,可以复习归并排序和树状数组。
归并,分治,递归,二分。这些问题很有共同之处啊。归并树,划分树也是相关问题。
1.8 小飞的电梯调度算法
要注意每层下电梯人数。
解法二的想法非常有用。很多问题都应该是这么考虑的。假设电梯停在第i层次,算出总共要爬的楼梯层数。如果停在i-1层,那么会变成--,如果停在i+1层会变成---,进而 可以启发从第一层开始考察,根据上面的策略进行调整,直到找到最佳楼层。
1.9 高效地安排见面会
转化为图模型进行着色
1.10 双线程高效下载
使用接口进行编程。信号量与mutex的区别。
要练习一个多线程程序的编写。
1.11 NIM(1)
所取石头堆对称地方取相同数目的石头~~
1.12 NIM(2)
p73的验证很犀利。
1.13 NIM(3)
以上问题不能一直想着找出一个必胜的方法。一般情况下要分情况进行讨论。其中很重要的是,引进了安全局面,不安全局面。
p76的筛选法复习一下,不错。以及在这道题目的应用。
1.14 连连看游戏设计
怎样用简单的计算机模型来描述这个问题?答曰:自动机模型适合用来描述程序设计。p89
然后~~~
联系hdu 1175写代码。
1.15构造数独
解法一,用来构造的方法与八皇后类似。回溯。
解法二,通过对话行列的方式确实可以生成局面。但是很怀疑这样生成的初始局面容易被破解。玩家知道这个规律可以瞬间搞定吧。。
尝试写写。有时间用dance link 搞。
1.16 24点的游戏
看的快。p105不是很清楚,再探。
1.17 俄罗斯方块
这题非常好。用什么数据结构表示等等~
4 X 4 表示下落方块的方法很好。以及可到达区域~~消除等。
好好再看。
1.18 挖雷游戏
~
数字之魅 ------------------- 很常碰到的问题了,包括扩展题,应该掌握。
2.1 求二进制中1的个数
移位呗。
解法3很巧妙。
2.2 不要被阶乘吓到
阶乘乘积二进制最低0和最低1.
ret = 0;
while(N)
{
N = N / 5;//求最低1的时候换成 N >>= 1;
ret += N;
}
2.3 寻找发帖“水王”
有人发帖超过一半,那么每找到两个不同数字就消去。最后剩下的就是。
扩展题,有3个发帖超过1/4,那么每找到4个各不相同的就消去?用4个保存id,4个保存出现次数,应该可以实现!
2.4 1的数目
有点繁琐
2.5 寻找最大的k个数
堆啊。这个很显然。要实际操作一下。
别的方法也可以学学。扩展题跟海量数据,跟搜索,跟实际很有关系。可以做做。
2.6 精确表达浮点数
乘以10^n
2.7 最大公约数问题
相减的方法不错。p153方法不错。
2.8 找符合条件的整数
hard
2.9 斐波那契数列
数学。。
2.10 寻找数组中的最大值和最小值
分治法,递归形影不离。。
两两进行。
2.11 寻找最近点对
p173方法不错。一旦分治,实现上估计又是递归了。
2.12 快速寻找满足条件的两个数
解法2 hash
解法3 排序, i++, j-- 是不错的想法。
2.13 子数组的最大乘积
~
2.14 子数组最大和
动态规划,懂。
2.15 子数组最大和(二维)
如果限定在a ,c行之间,再求解,那么显然就是一维了。这样,只要枚举矩形上下边界a,c就可以了。讲解得非常好。
这里的“部分和”也是减少复杂度的好方法。ps[c][i] -ps[a-1][i] - ps[c][i-1] + ps[a-1][i-1]
2.16 求数组中最长递增子序列
长度为k的递增子序列最大元素的最小值为MaxV[k]
2.17 数组循环移位
分别倒置,再总的倒置。
2.18 数组分割
可达。。p204其实就是利用可达性
2.19 区间重合判断
p207进行合并区间。
其实可以用线段树做做。
2.20 程序理解和时间分析
理解了半天,大致意思应该是序列中前k个都整除,连续两个不整除,第三个用整除,这个数是什么?
运算时间,分钟,不懂。。
2.21 只考加法的面试题
~
结构之法 ----------------- 二叉树等递归啊,实际实现一下,做一下习题
3.1 字符串移位包含的问题
今天考虑的时候为什么没有想到写了两次的方法呢?循环数组那题都想到了。题意讲得有点不清不楚。
3.2 电话号码对应英语单词
电话簿
3.3 计算字符串的相似度
其实就是编辑距离。p224解释很好。
3.4 从无头单链表中删除节点
把下一节点拷贝上来,再删掉下一结点。哥懂。
3.5 最短摘要的生成
最短摘要的定义是包含所有关键字的最短字符串。从头开始搜索。每次向前移一个字。进化到移到第一个关键字下一个字。
不过p232的代码貌似没有实现移动到第一关键字下一个字?
3.6 编程判断两个链表是否相交
(其实之所以会相交,原因是没有对最后一个结点设置为null,否则分配空间的时候怎么可能重复分配。也可能分配空间只分配几个结点,然后进行一下指针的赋值,而具 体指向的是什么,未必知道。但是有一点可以肯定的是,两个不带环的相交单链表的最后一个结点必须是一样的,因为只有最后一个结点的next指针是null)
解法2 对地址进行hash。。
解法3 想法很好。
解法4 直接比较最后一个结点是否相同。
扩展问题:a)如果带环呢? b)怎么求出第一个相交点。 结合编程艺术进行考虑。
3.7 队列中的最大值操作问题
解法2的用堆,但指针过于乱,增删很不方便。
解法3 队列记录max很不方便,而栈方便(可以考虑一下为什么), 所以用两个栈实现一个队列。
两个栈实现一个队列,这不是什么密码了。但是,两个栈怎么调度呢?一个方法是:栈a,b组成队列。入队时候b进行push。出队从a出,如果a为空,则将b的pop出来全 部push到a中。要查询最大值,比较两个栈记录的最大值。
3.8 求二叉树中结点的最大距离
貌似是rmq, lca问题。剑指offer貌似有论述。看看。
实现一下。
3.9 重建二叉树
二叉树问题大多使用递归。这几题都是。
思路与自己想的差不多。实现一下。数据结构的习题集,很多好题目,可以做做。
3.10 分层遍历二叉树
~
3.11 程序改错
二分。。不一定这么写吧。
不过,改错,尽量不改变框架的前提下进行,别搞的面目全非。
数学之趣 -------- 概率题,数学题 有待研究啊
4.1金刚坐飞机问题
4.2 瓷砖覆盖地板
不难。
用面积的奇偶来验证是否可以覆盖,不错。
4.3 买票找零
卡特兰数。。
4.4 点是否在三角形内
解法2, 是否一直在左边!good
4.5 磁带存放优化
~
4.6 桶中取黑白球
p285简化的很好。模型表示得很清楚。
解法2,又是异或。。
4.7 蚂蚁爬杆
相遇即是穿越
4.8 三角形测试用例
正常功能,测试测试非法输入,测试边界附近 学习
4.9 数独知多少
4.10 数字哑谜和回文
4.11 扫雷游戏的概率