有人做9月4日的阿里笔试么

好难好难,一直觉得自己代码能力还挺好的,但居然直接倒在笔试上

想问一下:第一题的组合数(a+b+c+d)!/a!/b!/c!/d!,是直接调用库么?我是手写的,导致又慢又容易错。。。很可能是跪在这里了,刚才看了一下,n=10的时候,手算跑不动

第二题的话:应该不是用最长路径,因为如果有一条路径特别长,但是孤孤单单的话,就不是最优解。。我的想法是从上到下dfs,同时记录之前已有的树的个数cur,如果当前节点有t个节点,那么更新到下一轮应该是cur+t-1,一直跑到最后再更新res,我觉得思路应该是对的啊。。但是告诉我是错的,还不知道哪里错了。。
#笔试题目##阿里巴巴#
全部评论
A了一题,只要计算(N*N)!/a!/b!/c!/d!。第二题树是我最拉闸的那块了。我的思路:找出最长路径,去掉最长路径所有结点,看有几棵树,这思路对吗?😂
1 回复 分享
发布于 2020-09-04 10:06
点赞 回复 分享
发布于 2020-09-04 10:03
视力表的暴力只过了60%。。
点赞 回复 分享
发布于 2020-09-04 10:04
刚做,第一题暴力50% 第二题蒙了20%😂,太菜
点赞 回复 分享
发布于 2020-09-04 10:05
第二题 我想的是每次从根节点往下删,每次选择子节点最多节点去删。然后统计组数 但是没写完 555
点赞 回复 分享
发布于 2020-09-04 10:07
排列组合公式想不起来,我吐了
点赞 回复 分享
发布于 2020-09-04 10:07
弱弱的问一句,第二题怎么处理输入😹
点赞 回复 分享
发布于 2020-09-04 10:08
第二题我的想法是找出叶子节点,然后遍历删除每个叶子的情况,找剩下的每个节点的father,然后统计father个数,感觉思路没问题,不知道为什么只有0.1😂
点赞 回复 分享
发布于 2020-09-04 10:09
加起来过了0.7能收到面试吗😫
点赞 回复 分享
发布于 2020-09-04 10:11
struct Node { Node *pre; std::unordered_multiset<Node*>m_next; int value; Node(const int&x) :pre(nullptr),  value(x) { } }; int main() { int n; cin >> n; std::unordered_multimap<int, Node*>m_Nodes; for (int i = 0; i < n-1; i++) { int a, b; cin >> a >> b; if (m_Nodes.find(a) != m_Nodes.end()) { auto it = m_Nodes.find(a); Node *m_tempnode = new Node(b); it->second->m_next.insert(m_tempnode); m_Nodes.insert(std::pair<int, Node*>(b, m_tempnode)); m_tempnode->pre = it->second; } else { Node *m_tempnode = new Node(a); Node *m_tempnode2 = new Node(b); m_Nodes.insert(std::pair<int, Node*>(a, m_tempnode)); m_Nodes.insert(std::pair<int, Node*>(b, m_tempnode2)); m_tempnode->m_next.insert(m_tempnode2); m_tempnode2->pre = m_tempnode; } } 转下
点赞 回复 分享
发布于 2020-09-04 10:16
int m_result = 0; for (auto it = m_Nodes.begin(); it != m_Nodes.end(); it++) { if (it->second->m_next.size() == 0) { Node*head = it->second->pre; int m_temp = 0; while (head) { m_temp += head->m_next.size() - 1; head = head->pre; } m_result = std::max(m_result, m_temp); } } std::cout << m_result; return 0; 有没有大佬可以看看,可惜没有写完(一开始没有想到,第一题就用了10分钟,结果第二题做了50分钟都没做出来,真的难受)
点赞 回复 分享
发布于 2020-09-04 10:16
第一题模拟一下排列组合里面的从n中选择m个 的那个公式就a了 第二题设了两个数组 一个父亲数组,一个节点拥有的孩子数,把路径上的节点的孩子数坚毅再求和 只过了10。。不知道为啥 感觉改不出来,三十分钟就交卷了😢
点赞 回复 分享
发布于 2020-09-04 10:17
有原题吗,找了一会都没看见有人发原题和数据范围
点赞 回复 分享
发布于 2020-09-04 10:29
第一题是数学题吧,排列组合,我0.8,可能求组合的函数有点弟弟,所以大数过不了
点赞 回复 分享
发布于 2020-09-04 10:32
求组合数,可以先把组合数数组求出来,用公式c[i][j] = (c[i - 1][j] + c[i - 1][j - 1])  % mod;
点赞 回复 分享
发布于 2020-09-04 10:38
阿里基本每次都会有一个数学方法的题目,尤其是排列组合数相关的,一般要做一些约分相关的操作,求出每个阶乘数再乘和除都有判例过不了
点赞 回复 分享
发布于 2020-09-04 11:42
是挺难哦…我阿里笔试的时候正好是两个水题…有时候运气好重要
点赞 回复 分享
发布于 2020-09-04 12:00
第一题,直接用排列组合公式 !n^2 / (!a * !b * !c * !d) 。注意的点在于使用 BigIntener 来存数字(Java),不然那数字太大太大了。 void alibaba1() {     Scanner input = new Scanner(System.in);     int n = input.nextInt();     int a = input.nextInt();     int b = input.nextInt();     int c = input.nextInt();     int d = input.nextInt();     n = n * n;     BigInteger facN = factorial(n);     BigInteger facA = factorial(a);     BigInteger facB = factorial(b);     BigInteger facC = factorial(c);     BigInteger facD = factorial(d);     BigInteger denominator = facA.multiply(facB).multiply(facC).multiply(facD);     BigInteger result = (facN.divide(denominator)).remainder(BigInteger.valueOf(998244353));     System.out.println(result); } //取阶乘 暴力就完事了 BigInteger factorial(int n) {     BigInteger result = BigInteger.valueOf(1);     for (int i = 1; i <= n; i++) {        result = result.multiply(BigInteger.valueOf(i));     }     return result; } 很笨很暴力的方法了,但是 能AC 就是好方法🤣
点赞 回复 分享
发布于 2020-09-04 14:54
第二题System.out.println(3)骗了10%...实在不会
点赞 回复 分享
发布于 2020-09-04 15:03

相关推荐

10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
3 4 评论
分享
牛客网
牛客企业服务