编程之美 笔记

之前看过这本书,花了两天大致又看了一遍。做个笔记。

扩展题大多没做。很多题目还得自己实现一下。 ———  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 扫雷游戏的概率

    原文作者:vsooda
    原文地址: https://blog.csdn.net/vsooda/article/details/8600032
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞