摘要: 下面是两道常见笔试题:栈的原地排序。(注:所谓原地就是指不需要额外的辅助空间,或者只需要常数个额外空间)栈的原地倒转。但是在这里递归的思想非常抽象,但是又不得不让人叹服!(我也是看了别人的答案,简直太经典了!)另外,虽然不允许另外使用额外空间,但实际上递归本身就要很多空间。。。【栈的原地倒转】这里的递归思想用语言描述太复杂,但是您一看代码,加上那一点注释,很快就能明白的。相信你也会为这个递归的用法感到奇妙!#include <iostream>#include <stack>using namespace std;//display the stackvoid prin 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(361) 评论(0) 推荐(0)
摘要: 【问题】原文参见这里:http://yueweitang.org/blog/posts/rotate-coin-games.html原文中只给出了一个结果,但是没有分析过程。最后我逆向了一下,有点拾人牙慧。我再引用一下人家的题目:Alice和Bob两人玩一种硬币游戏。游戏在一个的棋盘上进行,棋盘上每个格子上都有一枚硬币。在每一回合,Alice可以决定选择翻转某两枚或者一枚硬币,接着Bob可以选择将棋盘旋转90,180或者270度,也可以什么都不做。 游戏轮流进行直到棋盘上所有硬币都正面朝上或者反面朝上,Alice获得胜利。 如果Alice在游戏过程中无法看到棋盘上的银币,也不知道游戏刚开始的状 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(1492) 评论(0) 推荐(0)
摘要: 【问题】现在有一种彩票,总的有N个选择(比如36选7,那么总的选择就是36种),请问期望用多少次可以取到所有的彩票(有放回--当然,没放回就简单了。。。)?同样的一个题目就是:一个袋子里放N个不同的球,有放回的取球。请问期望用多少次可以取到所有不同的球?【解答】粗略的答案,这个期望次数是随着N的规模成O(N*logN)的规模扩大的。下面是分析:我们采取递推的方式,假设现在已经取到了i-1个不同的球或者不同的彩票(我们下边都用球代替),那么下一次取到第i个球的概率是:( N - ( i - 1 ) ) / N这个很显然:下次想取到一个跟以前的球不同的球,显然是在剩下的N-(i-1)个球中任取一个 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(5849) 评论(1) 推荐(0)
摘要: 下面是原题:表达式求值,一个字符串只由'+','-',和‘0’-‘9’组成,并且'+','-'只作为二元运算符。bool calculate(const char* exp, int &result);想了想,这个用STL做很简单,因为只有+号和-号,没有其他符号,只要从左向右即可,不需要用栈。存操作数的用双端队列,存操作符的用普通队列先进先出即可。下面是我的解决代码:#include <iostream>#include <string>#include <deque>#include 阅读全文
posted @ 2011-05-11 22:56 微型葡萄 阅读(385) 评论(0) 推荐(0)
摘要: 微软的Visual Studio 2008(VS2008)提供了一个新的选项,给用户显示C++对象在内存中的布局。这个选项就是/d1reportSingleClassLayout。具体使用方法如下,在写好相应的cpp文件之后,需要启动VS2008的命令行工具“Visual Studio 2008 Command Prompt”,切换到cpp文件所在目录之后,输入如下的命令:cl [filename].cpp /d1reportSingleClassLayout[className]cl当然就是MS的编译器咯;[filename].cpp就是你所想要查看的class所在的cpp文件(class定 阅读全文
posted @ 2011-05-11 22:56 微型葡萄 阅读(1430) 评论(0) 推荐(0)
摘要: 【概念】a) 作用域。作用域有大小之分。比如全局作用域大于局部作用域,这个很显然。要强调的是另一点:基类作用域大于派生类作用域。可能有人会有疑问,这两个作用域看不见摸不到,怎么知道大小?但是其实仔细想想,这很符合现实世界的面向对象模型:鱼的作用域显然要比金鱼大,交通工具的作用域肯定要比飞机大。如果你实在理解不了,那你还是就这么记住吧。b) 名字查找。请注意,这里的名字仅仅是指函数的名字,而不是原型!名字相同,查找即成功。这是个跟作用域密切相关的概念。名字查找符合以下的过程:1.根据对象,指针,引用的静态版本决定哪一个函数被调用。2.到相应的类中查找,如果没有找到,则到该类的直接基类中查找,按此 阅读全文
posted @ 2011-05-11 22:56 微型葡萄 阅读(446) 评论(0) 推荐(0)
摘要: 这是动态规划的经典问题之一,也有空间换时间的特点:储存计算过程中的信息,防止回溯及多余的遍历。【公共连续子串】我们知道,如果寻找“最长公共连续子串”问题,那么可以用下面文章所说的“矩阵填充法”:http://acm.whu.edu.cn/blog/read.php?24实际上不连续的子序列问题,也还是采用了类似的方法。【最长公共子序列问题】具体的解释和递推公式,可以看下面的参考文献。我的代码里面主要是两个函数,第一个是计算长度,第二个是在矩阵中回溯,以找到这个子序列。回溯采取了与生成完全一致的方法。//LCS#include <iostream>#include <vecto 阅读全文
posted @ 2011-05-11 22:56 微型葡萄 阅读(327) 评论(0) 推荐(0)
摘要: 题目要求:找到一个字符串中的一个连续子串,这个子串内不能有任何两个字符是相同的,并且这个子串是符合要求的最长的。例如:abcdeab,这个字符串有很多不重复子串,比如:abcde, bcdea, cdeab都是不重复子串,而且都是最长的。这个是一个经典的笔试题,百度也曾经出过。下面是代码:(注:由于我的代码本来目的是只求出长度即可,所以只保留了最后一个最长串的结果;如果想求得所有最长的不重复子串,即把所有可能都列出来,则需要再遍历一遍数组或者把所有结果保存下来,需要对代码作修改)PS:我在代码中用了hash_map,估计要比较新版的VC才支持,我不知道GCC或者G++需要把命名空间改为什么,请 阅读全文
posted @ 2011-05-11 22:56 微型葡萄 阅读(2570) 评论(0) 推荐(0)
摘要: 此题目的意思是:形如下面的两个字符串阶乘,判断哪个更大。12!!!! 和 3!!!!!。前者有4个阶乘号,后者有5个。利用的原理就是:越大的数的同阶阶乘越大。也就是阶乘的单调性。所以可以直接去掉相同个数的阶乘号后再作比较。没有写大整数类,所以请不要用剩余两个!!以上的数测试,会溢出。下面是主要函数的代码:#include <iostream>#include <string>#include <algorithm>using namespace std;long long factorial( string& str ){int excl = cou 阅读全文
posted @ 2011-05-11 22:56 微型葡萄 阅读(594) 评论(0) 推荐(0)
摘要: 首先,这个问题的最简单情况就是判断两个链表是否相交问题。我写过一篇文章,见这里:http://hi.baidu.com/microgrape/blog/item/5575771e6d3f9c03304e15d8.html===============================================================然后引申到如何判断一个链表存在环的问题。一个有环的链表示意图如下:注:图中的head是链表头;粗的线条表示链表,其中环从图中O点开始,从链表头到交点的距离为z。P点及另外两个长度下面再解释。关于这个问题,解决方案及解释如下:用两个指针来遍历这个单向链表, 阅读全文
posted @ 2011-05-11 22:56 微型葡萄 阅读(351) 评论(0) 推荐(0)