阿里巴巴的一道笔试题

这是一篇关于阿里巴巴笔试题目的博客,内容涉及代码枚举验证,通过计算得出运行结果为132。文章指出c(12, 6)/7 的值也等于132,并给出公式c(2n, n)/(n+1) = c(2n, n) - c(2n, n-1)。" 107855726,9954100,流浪动物救助系统设计与实现,"['后端开发', '数据库管理', '系统架构', '软件工程', 'PHP', 'Java', 'Python', '.NET']
摘要由CSDN通过智能技术生成
问题描述:
12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

问题分析:
我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排.
用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,就对应一种方案.
比如000000111111就对应着
第一排:0 1 2 3 4 5
第二排:6 7 8 9 10 11
010101010101就对应着
第一排:0 2 4 6 8 10
第二排:1 3 5 7 9 11
问题转换为,这样的满足条件的01序列有多少个.
观察1的出现,我们考虑这一个出现能不能放在第二排,显然,在这个1之前出现的那些0,1对应的人
要么是在这个1左边,要么是在这个1前面.而肯定要有一个0的,在这个1前面,统计在这个1之前的0和1的个数.
也就是要求,0的个数大于1的个数.
OK,问题已经解决.
如果把0看成入栈操作,1看成出栈操作,就是说给定6个元素,合法的入栈出栈序列有多少个.
这就是catalan数,这里只是用于栈,等价地描述还有,二叉树的枚举,多边形分成三角形的个数,圆括弧插入公式中的方法数,其通项是c(2n, n)/(n+1). 关于catalan数的证明以及应用请看 catalan数在笔试题中的应用

下面用代码来枚举验证:

#include<stdio.h>

/*计算n中1的个数*/
int bit_cnt(int n)
{
	int result = 0;
	while(n)
	{
		result++;
		n=n&(n-1);
	}
	return result;
}

int main()
{
	int F[6],B[6];			/*F代表前排,B代表后排*/
	int ans = 0,i,j,k,state,ok;
	for(state = 0; state < (1<<12);state++)
	{
		if(bit_cnt(state)==6)
		{
			i = 0;
			j = 0;
			for(k = 0; k < 12; k++)
			{
				if(state&(1<<k))
					F[i++] = k;
				else
					B[j++] = k;
			}

			ok = 1;
			for(k = 0; k < 6;k++)
			{
				if(B[k] < F[k])
				{
					ok = 0;
					break;
				}	
			}

			ans += ok;
		}
	}
	printf("%d\n",ans);
	
	return 0;
}

运行结果:132
而c(12, 6)/7 = 12*11*10*9*8*7/(7*6*5*4*3*2) = 132
注意:c(2n, n)/(n+1) = c(2n, n) - c(2n, n-1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值