2020年阿里巴巴实习笔试编程题

2020年阿里巴巴实习笔试编程题(一)

题目描述:现有n个人,从中选择任意数量的人组成一支队伍,再从这些人中选出1名队长,求不同方案数对 ∣ 1 0 9 + 7 ∣ \left\vert 10^9 +7 \right\vert 109+7的结果。如果两个方案选取的人的集合不同或选出的队长不同,则认为这两个方案是不同的。求输入任意人数 n n n得到的队伍数。
时间限制:30分钟,其中的解题思路如下:将问题分解为如下两个问题:
1、第一个子问题:从 n n n个人中能选出多少个集合,选择 1 1 1个人队伍时有 C n 1 C_n^1 Cn1种方式,选择 2 2 2个人的队伍有 C n 2 C_n^2 Cn2中方式,如此直到选择 n n n个人的队伍有 C n n C_n^n Cnn种方式。
2、第二个子问题:从每个集合中选出 1 1 1名队长,则有 i i i种方式。
3、总结规律:
当n=1时,f(1)=1;
当n=2时, f ( 2 ) = C 2 1 ⋅ f ( 1 ) + 2 f(2) = C_2^1\cdot f(1)+2 f(2)=C21f(1)+2
当n=3时, f ( 3 ) = C 3 1 ⋅ f ( 1 ) + C 3 2 ⋅ f ( 2 ) + 3 f(3) = C_3^1\cdot f(1)+C_3^2\cdot f(2)+3 f(3)=C31f(1)+C32f(2)+3

所以 f ( n ) = C n 1 ⋅ f ( 1 ) + C n 2 ⋅ f ( 2 ) + . . . + C n n − 1 ⋅ f ( n ) + n f(n) = C_n^1\cdot f(1)+C_n^2\cdot f(2)+...+C_n^{n-1}\cdot f(n)+n f(n)=Cn1f(1)+Cn2f(2)+...+Cnn1f(n)+n
##代码具体细节如下:

package com.runboo.test;
import java.util.Scanner;

public class Solution1 {
	public int fixNum(int n) {
		int result=0;
		for(int i=1;i<n;i++) {
			result=result+Cni(n,i)*fixNum(i);
		}
		return result+n;
	}
	public int Cni(int n,int x) {
		return fct(n)/(fct(n-x)*fct(x));
	}
	public int fct(int x) {//阶乘函数,服务Cni函数
		int result=1;
		for(int i=1;i<=x;i++) {
			result=result*i;
		}
		return result;
	}
	public static void main(String []args) {
		Scanner input = new Scanner(System.in);
		Solution1 aa=new Solution1();
		int n=input.nextInt();
		input.close();
		System.out.println(aa.fixNum(n));
	}
}

运行结果如下:
2020年阿里巴巴实习笔试编程题_第1张图片

你可能感兴趣的:(面试笔试)