摘要: 题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。分析:这又是一道考察发散思维的很有意思的题目。当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关键所在。看到的这个题目,我的第一反应是傻眼了,四则运算都不能用,那还能用什么啊?可是问题总是要解决的,只能打开思路去思考各种可能性。首先我们可以分析人们是如何做十进制的加法的,比如是如何得出5+17=22这个结果的。实际上,我们可以分成三步的:第一步只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1);第二步做进位,5+7中有进位,进 阅读全文
posted @ 2012-07-04 19:36 wolenski 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 问题(1):运行如下的C++代码,输出是什么? 1 class A 2 { 3 public: 4 virtual void Fun(int number = 10) 5 { 6 std::cout << "A::Fun with number " << number; 7 } 8 }; 9 10 class B: public A11 {12 public:13 virtual void Fun(int number = 20)14 {15 std::cout << "B::Fun with number " < 阅读全文
posted @ 2012-07-04 15:48 wolenski 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。分析:排序是面试时经常被提及的一类题目,我们也熟悉其中很多种算法,诸如插入排序、归并排序、冒泡排序,快速排序等等。这些排序的算法,要么是O(n2)的,要么是O(nlogn)的。可是这道题竟然要求是O(n)的,这里面到底有什么玄机呢?题目特别强调是对一个公司的员工的年龄作排序。员工的数目虽然有几万人,但这几万员工的年龄却只有几十种可能。上班早的人一般也要等到将近二十岁才上班,一般人再晚到了六七十岁也不得不退休。由于年龄总共只有几十种可能,我们可以很方便地统计出每一个年龄里有多少名员工 阅读全文
posted @ 2012-07-04 15:05 wolenski 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。这就是有名的八皇后问题。解决这个问题通常需要用递归,而递归对编程能力的要求比较高。因此有不少面试官青睐这个题目,用来考察应聘者的分析复杂问题的能力以及编程的能力。由于八个皇后的任意两个不能处在同一行,那么这肯定是每一个皇后占据一行。于是我们可以定义一个数组ColumnIndex[8],数组中第i个数字表示位于第i行的皇后的列号。先把ColumnIndex的八个数字分别用0-7初始化,接 阅读全文
posted @ 2012-07-03 23:20 wolenski 阅读(2307) 评论(0) 推荐(1) 编辑
摘要: 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次 阅读全文
posted @ 2012-07-03 20:47 wolenski 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。分析:在本系列博客的第28题《字符串的排列》中,我们详细讨论了如何用递归的思路求字符串的排列。同样,本题也可以用递归的思路来求字符串的组合。假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;而是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。这两种选择都很容易用递归实现。下面是这种思路的参考代码: 阅读全文
posted @ 2012-07-03 16:29 wolenski 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。分析:看到这个题目,很多人的第一反应是找到这个数组的最大值和最小值,然后觉得最大值减去最小值就是最终的结果。这种思路忽略了题目中很重要的一点:数对之差是一个数字减去它右边的数字。由于我们无法保证最大值一定位于数组的左边,因此这个思路不管用。于是我们接下来可以想到让每一个数字逐个减去它右边的所有数字,并通过比较得到数对之差的最大值。由于每个数字需要和它后面的O(n)个数字作减法,因此总的时间复杂度是O(n2)。 阅读全文
posted @ 2012-07-01 22:36 wolenski 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 运行下图中的C++代码,打印出的结果是什么? 1 bool Fun1(char* str) 2 { 3 printf("%s\n", str); 4 return false; 5 } 6 7 bool Fun2(char* str) 8 { 9 10 printf("%s\n", str);11 return true;12 }13 14 int _tmain(int argc, _TCHAR* argv[])15 {16 17 bool res1, res2;18 19 res1 = (Fun1("a") && F 阅读全文
posted @ 2012-07-01 16:56 wolenski 阅读(480) 评论(0) 推荐(0) 编辑
摘要: 一、给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中申请512M的内存(40亿 < 2^32 = 8*2^29 bit = 2^9M bytes = 512M)一个bit位代表一个unsigned int值读入40亿个数,设置相应的bit位读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在二、使用位图法判断整形数组是否存在重复判断集合中存在重复是常见编程任务之一,当集合中数据量比较大时我们通常希望少进行几次扫描,这时双重循环法就不可取了。位图法比 较适合于这种情况,它的做法是按照集合中最大元素max 阅读全文
posted @ 2012-07-01 15:18 wolenski 阅读(822) 评论(0) 推荐(1) 编辑
摘要: 问题:从 1到n个数中随机选出m个不同的数。(编程珠玑12章)第一种算法,从r个剩余的整数中选出s个,以概率s/r选择下一个数1 initialize set S to empty2 Size:=03 while Size<m do4 T:=RandInt(1,N)5 if T is not in S then6 insert T in S7 Size:=Size+1这个算法有一个致命的缺陷是每新产生一个随机数都要判断其是否已经被集合S包含。通常情况下,如果不借用其它数据结构,就需要遍历整个集合S。最极端的情况是m=n且T:=Ran... 阅读全文
posted @ 2012-06-29 16:55 wolenski 阅读(424) 评论(0) 推荐(0) 编辑