华为0819笔试第一题100%第二题60%第三题0%

1.力扣顺时针打印矩阵的题很像,加个判断就行

2.某一层的结点数量为cur,上一层为pre,那么能生成的二叉树就为:2*pre里面选cur种,即
不知道代码为啥不过。。我也判断了是否cur>2*pre
麻烦大佬帮着看看。
const int mod = 1e9 + 7;
long long sum(int i, int n)
{
	if (i == 0 || i == n)return 1;
	if (i == 1 || i == n - 1)return n;
	if (i>n / 2)i = n - i;
	long long up = 1, bt = 1;
	for (int k = i; k >= 2; k--)
	{
		bt *= k;
	}
	for (int k = n; k >= n - i + 1; k--)
	{
		up *= k;
	}
	return up / bt;
}
int main()
{

	int n;
	while (cin >> n)
	{
		vector<int> v(n);
		for (int i = 0; i<n; i++)
		{
			int num;
			cin >> num;
			v[i] = num;
		}
		sort(v.begin(), v.end());
		vector<int> temp;
		int count = 1;
		for (int i = 1; i<n; i++)
		{
			if (v[i] != v[i - 1])
			{
				temp.push_back(count);
				count = 1;
			}
			else
			{
				count++;
			}
		}
		temp.push_back(count);
		long long res = 1;
		int pre = temp[0];
		int flag = 1;
		for (int i = 1; i<temp.size(); i++)
		{
			int cur = temp[i];
			if (cur>2 * pre)
			{
				flag = 0;
				break;
			}
			res *= sum(cur, 2 * pre);
			pre = temp[i];
			res %= mod;
		}
		if (!flag)cout << 0 << endl;
		else cout << res%mod << endl;
	}
	return 0;
}

第三题俄罗斯方块,看着没啥思路就去想第二题去了 好像暴力模拟就行  有点难受。
#华为##笔试题目#
全部评论
第三题基本思路就是字符串相加,之前需要对字符串进行一下处理,后面再判断大小。可以参考一下思路 https://blog.nowcoder.net/n/6068ddfe58ad4a50ae0d0a89aef6af75
点赞 回复 分享
发布于 2020-08-19 21:47
第二题你求类似与阶乘的时候溢出了 建议每次取模 并且除法取模要求逆元  这个组合数你可以lucas求出来
点赞 回复 分享
发布于 2020-08-19 22:11
我把排列组合那里的/改成//就过了……大概是这俩能处理的数量级不一样大
点赞 回复 分享
发布于 2020-08-19 22:32

相关推荐

西松屋:说明原部门有机会把
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

更多
牛客网
牛客企业服务