摘要: [问题]有两个容桶,小桶的容量是4升,大桶的容量是9升,怎样才能从河中恰好打上6升水呢?[解析] 方法1:规约法(以下内容引自《How To Solve It》) 让我们弄消楚所给定的工具,我们必须用这两个容器来工作(已知的是什么?)。 目前我们还不知道怎样去量出恰好6升,但我们是否能测量其他某个东西?(如果你不能解决所提问题,首先去解决某个与此有关的问题。你能从已知数据导出来些有用的东西吗?) 让我们做点事,我们能够把大桶装满,然后倒掉小桶那么多;这样,我们就能够得到5升水。我们能不能也得到6升水呢? 当碰到这个难题时,我们就像绝大多数人所做的那样... 阅读全文
posted @ 2013-10-22 11:07 姚来飞 阅读(8700) 评论(0) 推荐(0) 编辑
摘要: [问题]若初始序列为gbfcdae,那么最少需要()次两两交换,才能使次序变为abcdefg任给一个由a-g这7个字母组成的排列,最坏的情况下需要至少()次两两交换,才能使顺序变为abcdefg[解析]答案为:5;6由每个字符向其正确位置连一条单向边,求出环的个数(自环也算)。字符总数-环的个数即为最少交换次数gbfcdaeabcdefg可以看出b为自环;a->g->e->d->c->f->a形成一个环。所以最少交换次数为7-2=5最坏的情况是所有字母形成一个环,此时最少交换次数为7-1=6 阅读全文
posted @ 2013-10-20 00:00 姚来飞 阅读(1457) 评论(0) 推荐(0) 编辑
摘要: 算法1:采用动态规划法判断子串是否是回文。开辟一个P[i][j]用来表示str[i..j]是否为回文,P[i][j]的状态转移方程如下:当i==j时,P[i][j]=true当i+1==j时,P[i][j]= (str[i]==str[j])其他,P[i][j]= P[i+1][j-1]&&(str[i]==str[j])算法2:字符串的最长回文子串就是该字符串与其逆字符串的最长公共子字符串 阅读全文
posted @ 2013-10-19 23:41 姚来飞 阅读(254) 评论(0) 推荐(0) 编辑
摘要: [问题]在不知道文件总行数的情况下,如何从文件中随机的抽取一行?[解析]首先想到的是我们做过类似的题目吗?当然,在知道文件行数的情况下,我们可以很容易的用C运行库的rand函数随机的获得一个行数,从而随机的取出一行,但是,当前的情况是不知道行数,这样如何求呢?我们需要一个概念来帮助我们做出猜想,来使得对每一行取出的概率相等,也即随机。这个概念即蓄水池抽样(Reservoir Sampling)。 有了这个概念,我们便有了这样一个解决方案:定义取出的行号为choice,第一次直接以第一行作为取出行choice,而后第二次以二分之一概率决定是否用第二行替换choice,第三次以三分之一的概率决定. 阅读全文
posted @ 2013-10-19 22:17 姚来飞 阅读(379) 评论(0) 推荐(0) 编辑
摘要: 两个正整数的最小公倍数等于两个正整数相乘再除以两个正整数的最大公约数 阅读全文
posted @ 2013-10-12 23:05 姚来飞 阅读(595) 评论(0) 推荐(0) 编辑
摘要: 2的32次方是10位数,所以2的90次方可以表示成一个3位的1000000000进制数,并用一个长度为3的无符号整型数组来存储各位的数值。 int _tmain(int argc, _TCHAR* argv[]){ int a[3] = {0}; int j; for(int i = 0;i = 0;--j) { a[j]*=2; } for(j = 2;j >= 0;--j) { if(a[j]>1000000000) { a... 阅读全文
posted @ 2013-10-12 22:14 姚来飞 阅读(701) 评论(0) 推荐(0) 编辑
摘要: [问题]我一个老朋友有且只有两个孩子,有一次我打电话过去,是他一个孩子接的,而且是个女孩,那么他有两个女儿的概率是多少?[解析]注意,“接电话的是女孩”这个条件,并不等同于“至少一个是女孩”,它不是“至少一个是女孩”的充要条件,只是充分非必要条件。根据贝叶斯公式:P(两个都是女孩 ∩接电话的是女孩)=P(接电话的是女孩)*P(两个都是女孩 | 接电话的是女孩)=P(两个都是女孩)*P(接电话的是女孩 | 两个都是女孩)假设是从两个孩子中随机选出一个接电话,则P(接电话的是女孩)= P(接电话的是女孩|女女)* P(女女)+P(接电话的是女孩|男女)* P(男女) +P(接电话的是女孩|女男)* 阅读全文
posted @ 2013-10-12 21:00 姚来飞 阅读(1354) 评论(0) 推荐(0) 编辑
摘要: 阿里巴巴笔试题:假设函数rand_k会随机返回一个【1,k】之间的随机数(k>=2),并且每个整数出现的概率相等。目前有rand_7,通过调用rand_7()和四则运算符,并适当增加逻辑判断和循环控制逻辑,下列函数可以实现的有:ABCDA:rand_5 B:rand_21 C:rand_23 D:rand_49解析:先考虑如何用rand_7()实现rand_5(): 一个非常直观的想法就是不断地调用rand7,直到它产生1到5之间的数,然后返回。 代码如下:int Rand5(){ int x; do { x = Rand7(); } whil... 阅读全文
posted @ 2013-10-06 21:43 姚来飞 阅读(953) 评论(0) 推荐(0) 编辑
摘要: 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列。数列的定义为C(0)=1,C(n)=C(0)*C(n-1)+C(1)*C(n-2)+…+C(n-1)C(0),其一般项公式为C(n)=C(2n,n)/(n+1) 组合数学中有非常多的组合结构可以用卡塔兰数来计数。这里的例子分为两类: 第1类:抽象模型为入栈出栈序列问题 1.基本模型:一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列? [解析]n个元素的入栈出栈序列长度为2n。序列中的第1项必定是表示元素1入栈的,而元素1的出栈操作一定在序列中的第2i(表示偶数)个项,因为如果是在第2i-1(表示奇数)个项,那么... 阅读全文
posted @ 2013-05-08 00:17 姚来飞 阅读(1000) 评论(0) 推荐(0) 编辑
摘要: 问题1:有13个球,其中12个重量相同,只有一个次品不知道是轻了还是重了。请用天平称三次,将这个次品找出来。 [解析] 13个球要称量,肯定要分成3堆。不放到天平上的那堆,很容易就知道不外乎只能考虑3,5,7个。若放7个,怕是傻了,剩下两次怎么分得清?3个,太天真了。最可能是5个。蒙对了这数目,省你不少力气,不然要多费一层思考的堆栈来排除了。具体解决方案如图1所示。图1 问题2:有12个球,已知其中11个重量相同,另一个不知道是否是次品。请用天平称三次,确定其中有无次品,如果有的话,将这个次品找出来,并确定其是偏轻还是偏重。 [解析] 解决方案如图2所示。图2 称球问题的一般... 阅读全文
posted @ 2013-05-03 18:34 姚来飞 阅读(903) 评论(1) 推荐(0) 编辑