【整理】常见的算法(智力)题

下面的题目都来源于网上。我把它们整理一下,或者给出解答,做为这段时间学习的记录。

1. Catalan数(n个节点的二叉树有多少个, n个元素的进栈出栈序列有多少个) 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

 

2. 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1的个数。

    0-9: 1

    10-99:N(10-19) + 8*N(20-99) = 10 + N(0-99) + 8*N(0-9) = 10+9*N(0-9)

    100 - 999: N(100-199) + N(200-999) = 100 + N(0-99) + 8* N(0-99) = 100 + 9*N(0-99)

    1000 - 9999: N(1000-1999) + N(2000-9999) = 1000 + N(0-999) + 8*N(0-999) = 1000 + 9*N(0-999)     

比如:

     N(0-1300) = N(0-999) + N(1000-1300) = N(0-99) + 1000 + N(0-300)

     N(0-300) = N(0-199) + N(200 - 300) = N(0-199) + N(200 - 299) = N(0-199) + N(0-99)

     总之,要把范围缩小,并且把首位的1拿掉,减小数字范围,这样就可以递归了。

 

 

3. 数组循环移位: 设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为ON),且只允许使用两个附加变量.

    [1,2, ..... n] = >[n-m+1, n-m+2, .... n, 1, 2, 3,...., n-m]

    分3步:[1, 2, 3, ...., n] => [n, n-1, ...n-m+1, n-m, 2, 1]

               [n, n-1, ...n-m+1, n-m, ..., 2, 1]=> [n-m+1, n-m+2, .... n, n-m, ..., 2, 1]

               [n-m+1, n-m+2, .... n, n-m, ..., 2, 1] =>[n-m+1, n-m+2, .... n, 1, 2, 3,...., n-m

 

4. 兄弟争财产:妈妈有2000元,要分给她的2个孩子。由哥哥先提出分钱的方式,如果弟弟同意,那么就这么分。但如果弟弟不同意,妈妈会没收1000元,由弟弟提出剩下1000元的分钱方式,这时如果哥哥同意了,就分掉这剩下的1000元。但如果哥哥也不同意,妈妈会把剩下的1000元也拿走,然后分别只给他们每人100元。问:如果你是哥哥,你会提出什么样的分钱方式,使你有可能得到最多的钱?(最小单位1元)。

     哥哥1100,弟弟900. 如果弟弟不同意,再分1000,弟弟最多是899(哥哥101). 否则哥哥不同意,大家都只有100

 

5. 有3个红色球,2个白色球,1个绿色球。取出2个不同颜色的球就能变成2个第三种颜色的球(比如:取出1红球,1白球,就能变成2个绿球)。问,最少几次变化能将所有的球都变成同一颜色,说明步骤和原因。

     还没有想出来,感觉是无解。

     [3R, 2W, 1G] => [5R, 1W] OR [2R, 4W] OR [2R, 1W, 3G]

6. 找符合条件的整数:任意给定一个正整数N,求一个最小的正整数MM >1),使得N * M的十进制表示形式里只含有1和0。

    野蛮暴力法:穷举,有一个问题,如果M不存在,那不是死循环了

    构造M: 先算个位,再算十位,一直递归。。。如N=31, 那么M的个位一定是1或者0,再看十位。。。。。这样,M的确可以算出来,但是怎么判断M是不是最小呢,或者如果M不存在,怎么办?

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值