摘要: 一、选择题1、题目略,此处主要有一个考点,如下。对于一个二维数组int a[3],a和&a的值是一样的,但是也是有区别的。a+1的值会根据数组a的类型决定增加的大小,这里int类型大小为4个字节,所以a+1比a大4,而使用&之后,取出的地址是没有类型的,&a+1实际只比&a大1。2、第二题简单,只要知道short类型占两个字节即可。二、简答题1、static关键字的作用,个人经验主要有以下几种:1)函数局部static变量,第一次函数调用被初始化,后续每次调用将使用上次调用后保存的值;2)全局变量中static变量,可以防止被其他文件的代码使用这个变量,有点将这 阅读全文
posted @ 2013-03-22 11:07 罗辑 阅读(1067) 评论(0) 推荐(1) 编辑
摘要: 2.5 寻找最大的K个数题意:无序的不相等的N个数,选出其中最大的若干个数。看到这道题,笔者首先想到的就是堆排序,堆排序的特性使得其非常适合于这个问题。书中解法四用到的就是堆排序算法,这个算法只需要扫描数据一次,而且仅占用K个数的空间,其他算法都无以匹敌。大学的数据结构中都会讲到堆排序,其也是二分思想的一个经典应用。2.6 精确表达浮点数题意:给定一个有限小数,或者无限循环小数,求其分数表达形式。这道题使笔者想起了很早就学过的一个证明,即证明0.999999999……等于1。解此题的方法就是用了上面的证明的方法,具体的证明过程也不难,无非就是通过缩放的方法消去循环节。而有限的小数直接可以表示为 阅读全文
posted @ 2012-11-05 19:57 罗辑 阅读(320) 评论(0) 推荐(1) 编辑
摘要: 2.3 寻找发帖“水王”题意:给N个数,其中某个数出现的次数超过一半,找出这个数。这道题目书中给出的解题思路是,在所有ID中,每次删除两个不同的ID,剩下的就是要求的ID。这个思想比较简单,但作者给出的代码策略很值得学习。代码维护一个具有相同元素的容器,由于元素相同,我们只需要用两个变量分别记录容器中元素的ID和个数。对于一个新需要考察的ID,若容器为空,则把这个元素加入容器,若不为空,则对比容器中ID和当前ID是否相等,相等则容器元素个数加1,不等则减1。对于扩展问题中,3个水王的情况,我们可以维护三个容器,思想还是一样的。首先考虑是否可以合并到容器中去,若合并不了,则说明这是一个和已有容器 阅读全文
posted @ 2012-11-01 19:19 罗辑 阅读(217) 评论(0) 推荐(1) 编辑
摘要: 2.1 求二进制数中的1的个数题意:8bit无符号整型变量N,求其中二进制位中1的个数。解法一,笨方法,使用除法和模运算,即使编译器能帮人优化,但解法的思想并没有走到位这个概念上去。解法二是笔者首先想到的解法,即与0x01进行与运算,判断是否为1,之后再右移,这个方法清晰明了,虽说复杂度为O(log2N)级别,但和再小的复杂度差别不大。解法三的确是一个非常巧妙的方法,复杂度只和1的个数有关,每次循环都消去最低位的1,最终得到1的个数。解法四有点走火入魔了,写代码都累死,说是空间换时间,写代码的时间不算?解法五可以说是解法四的改良版本,直接hashtable就OK,算是先把结果算好存着。若改成3 阅读全文
posted @ 2012-10-26 15:51 罗辑 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 1.17 俄罗斯方块游戏题意:俄罗斯方块游戏的逻辑设计。总的来说,这道题目并没有什么难点,有点偏工程化的东西,按照游戏规则进行相关设定,然后编写代码即可。1.18 挖雷游戏题意:windows系统自带的扫雷游戏,添加每个方格里面是否有地雷的概率。概率这个东西,这里只谈一下100%的情况,即从局面上判定哪些方块肯定是有地雷的。假设有两个集合A和B,B包含于A,A里面的元素都是没有点开的方块,|A|=x,|B|=y,A和B对应的地雷数目分别是m和n。如果x-y==m-n,那么A-B里面的方块下面都是地雷。 阅读全文
posted @ 2012-10-26 13:52 罗辑 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 1.16 24点游戏题意:给定4个数,运用加减乘除和括号,构造多项式,使得结果等于24。解法一是穷举法,四个数字有4!排列,运算符号有43种可能,外加5种加括号的方式。为什么是5种?书上没说,推断如下:括号决定先算什么,最先需要算的两个数决定了3种可能组合,那么我们可以得到:ABCD->(AB)CD, A(BC)D, AB(CD)把一个括号内的看成一个数字,那可以认为,上一步把4个数字变成了3个,现在需要把3个数字变两个,那么可以继续:(AB)CD->((AB)C)D,(AB)(CD)A(BC)D->(A(BC))D,A((BC)D)AB(CD)->(AB)(CD),A 阅读全文
posted @ 2012-10-25 15:41 罗辑 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 1.14 连连看游戏设计题意:设计连连看游戏。这道题目最关键的问题是,连连看游戏中的寻路问题,这个寻路和以往的最短路径稍微有点不一样,这里是要找一个转弯数目最少的路径。使用BFS进行搜索,需要重新定义一下最短路径的概念,这里的路径长短不再按照实际距离来算,而是按照转弯的数目来算,转弯数目越少,则路径越短。算法搜索的时候也是一步一步进行移动的,从初始点出发,首先标记所有不用转弯就能直接到达的方格弯数为0,继而从这些弯数为0的方格进行扩展,标记所有弯数为1……如此反复下去,如果弯数为2还没有找到,则表明这并不是一次有效的连接。由于这里已经限制了弯数是要小于3的,所以笔者认为可以换一个角度考虑。1) 阅读全文
posted @ 2012-10-25 11:10 罗辑 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 1.12 NIM(2)“拈”游戏分析题意:给N块石头,玩家X把石头分成若干堆,然后按照XYXY...这样的顺序取石头,每次可以取一堆石头中的任意数目(大于0)个石头,谁先取完谁胜。此题目的关键在于证明一个规律,即N为偶数的时候,先动手的输,N为奇数时,先动手的人赢。假设N个石头被分成m堆,为(A1,A2,……,Am),最后取光了必定为(0,0,……,0),将此时(A1,A2,……,Am)全部异或操作,结果为0。三条结论:1)N为奇数的时候,XOR(A1,A2,……,Am)的结果为奇数,这个很明显。2)当XOR(A1,A2,……,Am)不等于0的时候,总有一种取石子的方法可以把XOR(A1,A2 阅读全文
posted @ 2012-10-22 14:42 罗辑 阅读(322) 评论(0) 推荐(0) 编辑
摘要: 1.10 双线程高效下载题意:一个线程写磁盘,一个线程读网络,高效地实现下载。这道题放在这里感觉有点怪怪的,因为这个东东在并行程序设计里面是比较基础的。文章里面给了一个简单的信号量的方案,实现起来效果应该还是不错的,中规中矩。个人习惯,关于磁盘读写的问题,可以优先考虑内存文件映射,特别是后面关于多线程下载的情况,这样我们的代码只管写内存,写磁盘的问题让操作系统考虑去吧。1.11 NUM(1)一排石头的游戏题意:N个石头,每个石头都有一个ID,ID从1开始连续编号到N,每个玩家每次可以取任意一块石头,或者取编号相邻的两块石头,谁最后取完谁胜利。题目是从这样的分析得到解法的:1)一块和两块石头,一 阅读全文
posted @ 2012-10-21 22:23 罗辑 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 1.9 高效率地安排见面会题意:地图着色问题。这个问题是个没有高效算法的问题,看点主要是如何将见面会的安排转化为一个具体的数学模型——地图着色问题。扩展问题题意:带有时间段的见面会安排问题。书中开始便提到,这个题目是可以作为地图着色问题来做的,但不是最佳解法。第一个问题抽象后,所有信息都使用上了,恰好与地图着色问题相匹配,而扩展问题显然多了一些信息,其包含容斥关系是面试时间段信息的一个子集。普通的图无法直接包含进扩展问题中的时间先后关系信息,因而不是扩展问题的完整的数学模型,程序在搜索的时候会搜索大量多余的状态。所以,在解决问题的时候,尽量充分利用已有信息是很有必要的,它可能会有效减少解空间搜 阅读全文
posted @ 2012-10-20 15:39 罗辑 阅读(161) 评论(0) 推荐(0) 编辑