段长风🍀 level
获赞
3
粉丝
3
关注
4
看过 TA
0
湖南工业大学
2021
C++
IP属地:四川
暂未填写个人简介
私信
关注
头像
2020-03-25 15:08
C++
#阿里笔试2020# 看到了这里都在讨论3.23的两道题,但是看到大家解法好像都不是太好,我分享一下我的解题方法吧。第一题 求排列组合。在n个人中可以取任意数目的人数组成一队,并且可以在其中选队长,问一共有多少种组合方式,最后的结果模10^9+7.这题更像是一个数学题。由组合公式可知 C(m,N)=n!/((n-m)!+m!)每个组合中队长的选举可能有m种那么每种人数组合就是C(m,N)*m 举个例子 假设N=4则一共有 C(1,4)*1+C(2,4)*2+C(3,4)*3+C(4,4)*4 =32种那么N个人一共有n+n*n(n-1)+n*(n-1)(n-2)+n(n-1)(n-2)(n-3)……+n*n(n-1)+n种,值得注意的是由于每个因子都乘了一个m 所以和组合公式有一点点差别。原本的本来是C(m,n)=C(n-m,n),现在是C(m+1,n)=C(n-m,n)两边完全对称,我们只需要算到n/2,然后乘以二就可以了。则上述公式可以提公因式得:n(1+(n-1)(1+(n-2)(1+(n-3)(……1+(n-n/2)(1)))))*2。这里又有一个小陷阱。奇数和偶数的公式是不一样的,偶数当然两边完全一致,直接乘2就好了,奇数中间只有一个,不能乘2,所以我们最后加上中间那个组合就可以了。C++代码如下:int howMany(int n) {int result = 0;for (int i = n/2+1; i {result = (result + 1)*i;}if (n % 2 == 0)//偶数 直接对半*2{result= result*2;}else {//奇数  偶数的基础上+上n/2的排列组合int temp1=1,temp2=1;for (int i = n / 2 + 1; i temp1 *= i;}for (int i = 1; i temp2 *= i;}result = temp1 / temp2 + result;}return result;}第二题写不下了 见评论
投递阿里巴巴等公司10个岗位 C++求职圈
0 点赞 评论 收藏
转发
头像
2019-10-21 22:43
C++
0 点赞 评论 收藏
转发
牛客网
牛客企业服务