图森未来2020校招笔试题官方题解

图森未来2020校招真题题目已经在牛客网上上线啦,欢迎大家去练习:

官方题解:

下面给出官方题解,大家记得先练习再来看解析哦~

卷一:https://www.nowcoder.com/test/20723898/summary

题目1、简单卷积:

这道题是本套试卷的签到题,目的是为了给大家热身和测试系统。

同时为了防止大家因为粗心没有看清公式,我们特地调整了题目中卷积的计算方法。

具体解法只需要按照公式写循环即可。


题目2、迷宫难题:

本套试卷的基础考核题,考察的是应用和实现基础算法的能力。

这道题是标准的网格图(稀疏图)最短路的题目,可以使用各种宽度优先搜索或最短路的算法解决。

注意深度优先搜索的解法是无法通过全部数据的,部分数据会超时。

题目3、旋转数字:

这道题是本套试卷难度偏高的题目,主要考察数学能力和发现问题规律的能力。

首先可以使用最暴力的做法,即循环计算后k位并从第k位开始依次对比。

其次,因为数字的循环是有规律的,所以我们可以通过数学计算在O(1)的复杂度下对于任意k值获得第k位的数字。这里虽然没有优化暴力做法的复杂度,但是为下面的做法提供了可行的解决方案。

注意虽然k的最大长度有10^9,但是因为t和s的位数最大只有9位,所以两个无限长的数字的循环节最长分别只有9*9=81位,而两个循环节长度(记为T和S)的最小公倍数满足 LCM(T, S) < T*S < 81 * 81 = 6561。所以,只需要从第k位开始反向进行几千次比较,就一定可以结束整个循环(如果这几千次比较都没有比出大小,那么一定是平局)。当然也可以根据数据的具体情况进一步缩小这个上界,不过对最终程序的结果不会有任何影响。


卷二:https://www.nowcoder.com/test/20723906/summary

题目1、寻找十字

这道题是本套题目的签到题。

具体的做法是以除最外圈外的每一个位置为中心循环检查,如果该位置及其上下左右的所有位置都是1,则满足条件的图形数量加1。

题目2、卡车牌照

这道题是一道基础考核题,考察的是基础算法的实现和组合的能力。

 

首先因为这道题需要车牌号是素数,那么首先要考察的一定是如何检查一个数是素数。

首先最简单的方式是每次进行试除,这样单次查找素数的时间复杂度是O(sqrt(n)),对于题目中的情况大概每次需要试除1000个数(sqrt(10^6)=1000)。

但是因为需要试除的次数很多,所以一个更好的方式是预处理一个素数表,这样之后就可以使用O(1)的时间复杂度在表中查找某个数是不是素数。使用试除的办法查找的话复杂度是O(n*sqrt(n))=O(n^(3/2)),对于n=10^6的情况来说太大了。所以这里可以利用筛法预处理素数表,复杂度大概是O(n*lg(lgn))。

以上的求素数方法已经可以通过这道题目的所有数据了。但是实际上我们还可以使用一些其它的素数测试方法来完成,比如Miller-Rabin算法可以让我们不需要预处理素数表也能够使用O(c)的时间复杂度判断某个数字是不是(极大概率是)素数,其中c为常数。因为Miller-Rabin的判断错误率仅有1/(4^c),所以取一个不是很大的c就可以完成素数判断。具体算法和证明不在这里赘述,有兴趣的同学可以去自行查阅资料。

 

在拥有了判断素数的方法后,这道题就变成了一道简单的宽度优先搜索,即每个数字的54个可能的后续状态(对于30%的数据是36个)中,只有素数是可到达的,问最少经过多少次转移可以到达最终状态。


题目3、服务器布局:

这道题是一道纯考察代码实现能力的题目,希望考察的是工作中可能遇到的编写复杂逻辑的代码而不出错的能力。

 

题目本身没有任何难度,只要预先计算整个输出的大小并开设字符数组,并不停地根据输入中的树形结构填充到数组中即可。

当输入的最深层级为k时,输出的大小为2^k+1行,2^(k+1)+1列。

填充到数组中时可以每次都将四个角填充上“+”,边界填充上“-”和“|”符号。这样虽然会导致某些位置被重复填充多次相同的符号,但是对输出不会有任何影响。带来的好处则是实现更加简单,甚至可以实现函数模块化的完成某个层级中字符的填充。

模块化地实现这个程序而不是把所有代码堆砌到主程序中可以很好的避免代码中小的错误,以及可以更容易地编写测试代码调错。这是我们在工程中追求的“good smell”,我们也希望同学们可以从这道题目中体会到提升代码的工程质量对于复杂代码编写的重要性。


第三套:https://www.nowcoder.com/test/20723913/summary

题目1、公司扩招:

这道题依旧是一道签到题,但是我们这次设置了占比20%的大范围数据。

 

对于80%的小数据,只要直接按照公式计算整个数列即可,唯一要注意的是必须每次计算后立刻取模,且C++要使用long long或类似的大范围类型存储中间结果,不然可能会导致溢出。

 

而对于剩下20%的数据,因为数据规模达到了10^9999,所以很明显可以看出这是一道查找循环节的题目。

可以发现,其实这道题结果数列的每一个数字是多少,只和这个数字的前两个数字有关。如果数列不同位置的前两个数字是相同的,那么后一个数字一定是相同的。

而在对100003取模之后,前两个数字有大约10^12中不同的组合方式。这里可能会有同学直接放弃这个做法,但是其实只要写一个很短的程序稍微试验一下就会发现,对于题目中可能的100种k值,实际的循环节都远远没有10^12这么大。所以,只要先计算循环节长度,之后再进行一次高精度的取模运算,就可以根据循环节得出最终结果。

这里的高精度取模运算本质上是高精度除法,但是因为除数是非高精度数,所以实际上是对小学时竖式除法的编程模拟,即使对没有特殊学习过如何实现高精度除法的同学也并非那么困难。当然,因为考试时间有限,这20%的数据只属于加分项,即使没有得到这20分也是完全没有问题的。

题目2、快递机器人:

这道题是一道考察算法掌握和一些简单数学推理的题目。

 

最简单的做法是直接对所有的快递进行搜索,检查所有可能的情况,复杂度为O(n!)。

注意即使是这种做法中,因为机器人是不能向y轴负方向移动的,所以搜索的过程中也要注意排除非法的解。

 

进一步考虑,因为机器人不能向y轴负方向移动,所以可以只在y轴每一层的内部进行搜索,层与层之间的移动是已经固定了顺序的。但是因为y轴每一层收取快递所需要的时间花费是和来到这一层时的初始位置相关的,所以搜索的复杂度依然很高。

再进一步,当我们确定了每层的初始位置和结束位置时,实际上可以使用O(1)的时间复杂度计算出收取全部快递所需要的时间花费,因为一定要经过最左和最右两个快递的位置。因为每一层的搜索结束位置就是下一层的初始位置,而向y轴正方向移动的次数是固定的,所以这时就可以以层数和结束位置为状态,使用动态规划的方式优化搜索的速度了。

 

而实际上我们还可以发现,只要在每一层从最左侧或最右侧的快递位置向上走,就一定能够找到最优解,即我们每一层的开始/结束位置只和状态有关。具体的证明这里不展开,留给同学们作为思考题。这样,就可以将有效状态的数量大幅减少,从而可以用动态规划解决这道题的所有数据范围。

题目3、另一个快递机器人:

这道题是考察代码实现能力的题目,其中也包括了考察简单的算法能力。

 

通过阅读题目可以发现,这道题最终的结果计算包括两部分,即楼之间移动所需要花费的时间和楼内移动所需要花费的时间。且因为送快递的顺序是固定的,所以这两部分时间的计算没有任何重叠,可以分别计算并直接累加起来。

对于楼内移动时间的计算,实际上要计算的问题可以规约为:从1层到k层之间有多少个数位中包含4的数字?因为实际上最高的楼层号只有10^6,所以这里其实预处理一下所有楼层号就可以了。当然也可以使用容斥原理来计算,但是因为实现过于复杂所以这里不推荐。

对于楼间移动时间的计算,实际上就是一道最短路的问题,因为前面的题目也考察了很多最短路的知识,所以这里不再赘述。

最后,因为可能的情况比较多,所以实际实现中还需要注意代码的准确性。和题目2.3一样,更工程化的代码有助于实现的逻辑清晰,也会让测试更加简便。把代码全部写到一个主程序中很容易导致出错且很难调试。


#图森未来##校招##机器学习#
全部评论
(5000浏览0回复惨案😅) 我是这次图森未来的笔试出题人之一,简单和大家聊一聊这次出题的想法吧。 我们这次的笔试题的目标是希望让两类候选人能够通过笔试脱颖而出,从而可以更快获得面试机会并完成面试。其中一类是对于工作中可能使用到的基础算法和数据结构比较熟悉,且代码的速度和准确度满足基本要求的同学;另一类是对于更复杂的算法或一些更ad-hoc的算法比较熟悉,或者有更强coding能力的同学。 所以我们出题的方向也基本上是遵循这个原则的:一道签到题,一道基础算法题(这些算法或类似的基础算法是真的有可能在工作中需要被写出来的),一道需要更深入思考、了解更复杂算法或者更强coding能力的题目。 从我个人看来,这次的题目基本上达到了预期的目标。如果对这次的题目有什么想吐槽的,大家也都可以在这里聊一下!
1 回复 分享
发布于 2019-12-06 17:41

相关推荐

前辈们好!晚辈是一名在读硕士生,研究方向是计算机视觉、6D位姿估计、手术导航。按照目前的简历水平,请问能否够得着一些互联网大厂的实习面试资格呢,可以申请哪些类型的岗位呀?在考虑算法工程师,但是相比于计算机科班的同学,自己的项目经历还有刷题似乎有些薄弱了。简历还可以在哪些方面进行修改呢?提前感谢大家!
神哥不得了:神哥过年也来解答啦,简历这样写提升空间很大呀,算法的话要求顶刊顶会,如果有的话就会比较好找,看不出来你这两个是不是顶刊顶会,这些课题的话,对找工作帮助没有那么大,如果走算法的话应该会比较难,但是也不是完全没机会的状态
点赞 评论 收藏
分享
2024-12-31 11:37
已编辑
腾讯_前端开发
秋招结束,做了一个与牛客主流想法完全相反的决定。bg写在开头:本人是电气专业的211本硕,研0开始零基础转前端。历时一年半,刷了三段实习,暑期在🐧厂实习,最后顺利转正了,开的价位也挺满意的,不是白菜。其实家里面非常非常希望我去电网,几乎是从高中开始就帮我选好了这条路。所以家里的意见也一直是我转码路上相当大的阻力,尤其是今年大大小小的吵了很多架。最终也是拗不过我自己的想法,爸妈看到我拿到很好的offer以后,也终于尊重了我的选择。简单说说心理历程:大学期间没有想太多,一直在折腾七七八八的副业。作为期末冲刺型选手,保研了本校本专业。大四毕业做了算法相关的毕设,才发现编程没有想象中的难。于是研0开始考虑别的职业选择。转码的过程不展开多说,也是扎扎实实学了很久。如果也有非科班零基础自学的朋友想看经验分享我也可以后续展开写写。没选电网会不会后悔?我个人觉得,不会。做出这个选择我几乎没有一丝犹豫。1.&nbsp;电网最大的优势就是稳定性,而这恰巧是我最不看重的点。现在不会失业不代表十年后二十年后不会失业;&nbsp;世界局势随时可能发生变化,进电网也并非一劳永逸。个人认为这个世界上没有永远稳定的工作,只有稳定的个人能力。2.&nbsp;本人在大学期间就已经尝试过很多种乱七八糟的副业。也得出了一个结论:当今这个社会想饿死自己是一件很难的事情,在大城市靠一些信息差很容易就能赚到钱。所以也没那么怕失业裁员。3.&nbsp;本人是金牛座很爱钱,进互联网可以让我在年轻的适合就享受相对高品质的生活,以及更快的攒到第一桶金。以及,其实在东亚家庭里面,钱代表话语权。4.&nbsp;讨厌体制内的中年领导和热衷打探你私生活没有边界感的同事。当然,以上仅能代表个人的择业观。省会电网本身是个非常非常好的工作,只是不适合和我类似情况的个体。因为在牛客看到了太多劝退互联网无脑进体制内的内容,也想代表非主流的观点发发声。最后,希望所有人都能基于心底真正的想法来进行工作的选择,而非基于对未来不确定性的担忧和恐惧~还没找定工作的朋友们也不要着急,最近有很多补录机会。希望大家都能拿到自己满意的offer!希望大家的2025都能精彩充实! #我的求职思考#&nbsp;&nbsp;#秋招结束# #大厂#&nbsp;&nbsp;#电网#&nbsp;&nbsp;#2025秋招#&nbsp;&nbsp;
Java抽象带篮子:集美你的决定是正确的😍
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
9
37
分享

创作者周榜

更多
牛客网
牛客企业服务