2020网易笔试编程题(一)

题目:在一次聚会中,教授们被要求写下自己认可哪位教授的学术成果(也可以写自己,且可能出现重复)。已知,如果教授A认可教授B,且教授B认可教授C,那么即可视为教授A也认可教授C。现在我们想知道多少对教授是两两互相认可的?
(输入举例:输入教授人数:5,认可关系数:6,认可关系分别为:A->C,B->A,C->B,C->E,D->E,E->D。则两两互相认可的教授有4对:A<–>B,B<–>C,A<–>C,D<–>E。)
吐槽:网易21校招的在线笔试题,100分钟4道编程题。。。有一道题还算简单,思路很快出来,代码花了些时间,但是在网上编译不管怎么调都只通过了86%的测试用例,真素令人作呕!不得不说牛客网的编程系统检测太傻叉了。。。然后就是这道题了,一开始思路有点歪,导致浪费了不少时间,然后再确定思路的,然而实际不多了,费心费力把代码编译后提示超出内存限制。。。然后,就没有然后了,基本是凉凉了,不过本着不服输的原则,还是打算私下把这四道题争取都做出来,提升下自己的算法能力!
个人思路:我当时做题选择的思路就是利用二维数组,因为这种两两对应关系很符合矩阵中的对称性质,即i认可j,j也认可i,则相当与矩阵中(i,j)的值等于(j,i),因此我选择用二维数组,记录输入的认可关系。以上面的输入为例,将A,B,C,D,E看作1,2,3,4,5,因此得出初始的二维数组如下图所示:
在这里插入图片描述
将6对关系转换到二维数组中的结果就是(0,2),(1,0),(2,1),(2,4),(3,4),(4,3)位置的元素都为1,其余的都为0,(i,j)位置为1的就代表i认可j。
得出初始的关系矩阵后,我们还要找出那些间接存在从认可关系,例如(0,2)与(2,1)为1,则说明(0,1)也间接为1。这一步就需要对二维数组进行遍历了,依次对第i行进行遍历,然后找出该行中为1的列号j,然后进入与第j行,找出第j行中为1的列号,则把第i行中对应的列号的元素也置1。这样说有点迷糊,还是照样举例说明:如下图所示,以第一行为例,(0,2)为1,即1认可3,而3又同时认可2和5,在数组中就是(2,1)与(2,4)都为1,因此1也应该间接认可2和5,即(0,1)和(0,4)也该为1。按照这种方法,遍历完数组就能得到一个完整的关系矩阵了!然后再次遍历矩阵,判断(i,j)与(j,i)都为1的对数即为结果!
在这里插入图片描述
代码如下所示,经过测试感觉结果应该都没问题,不过当时网上编译提示的是超出内存限制,估计是我定义的二维数组的问题,可能导致空间复杂度比较高。后期看有没有时间优化一下吧(这就是我觉得网上编程笔试的鸡肋所在了,虽然我得出的可能不是最优解法,但至少也是一种可行的思路,测试结果也都是对的,结果电脑直接一把子给我个不通过,如果是面试官的话好歹也能给点分吧,真素无语死了!恶熏!)

#include<iostream>
#include<vector>
using namespace std;

int Solution(
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值