2022秋季校招

笔试真题+解析

Hulu2022校招笔试顺利结束

无论你是直通面试

还是遗憾止步笔试环节

希望你们都能从中有所收获

这不,Hulu大方地把真题分享给大家

并附上大佬们的详细解析

Let's check it out~

第一题:天使粒子

问题描述:

在一个线性管道里有一组粒子,它们位置互不重合,有着相同的运动速度,但有些粒子只能向左移动,有些粒子只能向右移动。这些粒子可以相互穿过且不会干扰粒子的运动(意味着粒子在同一时刻可以重合),因此所有粒子都会相对较快地离开管道。

现在我们将给定一组粒子,包含它们的类型和在管道中初始的位置,同时我们将给定粒子的运动速度,我们希望获得一个例子运动过程的动画。具体来说,在每个时间点我们都需要输出一个字符串,表示当前管道中粒子所占的位置

输入描述:

输入分为两行:

第一行为一个整数v,代表粒子的速度。

第二行为一个字符串s,代表时刻0时管道中粒子的状态,其中只可能有三种字符'L', 'R', '.'

'L'代表一个会向左移动的粒子;

'R'代表一个会向右移动的粒子;

'.'代表这个位置现在没有粒子。

1 <= v <= 10, 1 <= s的长度 <= 50

输出描述:

输出为若干行,每行都是一个字符串,第一行字符串代表时刻0时管道中粒子所占的位置,第二行字符串代表时刻1时管道中粒子所占的位置,以此类推。

输出的字符串只能包含两种字符'X'和'.'

其中'X'代表这个位置有粒子(可以有多个粒子);

'.'代表这个位置没有粒子。

输出的最后一行是一个全部由'.'构成的字符串,

代表此时刻粒子已经全部离开了管道,输出结束。

输入样例:

2

..R....

输出样例:

..X....

....X..

......X

.......

提示:

输入样例中有一个向右移动,速度为2,初始位置在管道左数第3个位置的粒子。之后移动到了第5、第7个位置,最后移动出管道,输出结束。

更复杂的输入会像这样:

4

RRL..LR..L.

题目解答:

这道题是一道比较简单的模拟题,解题思路比较直观。

我们可以构造一个粒子类Particle,并开一个数组存储题目给定的粒子。

Class Particle {int position; // 存储粒子当前的位置,可以为负数

int direction; // 存储粒子的运动方向,1代表向右移动,-1代表向左移动}

然后维护一个boolean类型的数组hasParticle[n],存储每个位置是否有粒子。对于某一时间点,我们首先把boolean数组全初始化为false。假设速度为v,则每个时间点我们都可以模拟粒子的运动,更新粒子的位置(position = position + direction * v),并且如果position在数组hasParticle下标内的话,更新一下hasParticle[position] = true。最后根据数组hasParticle的值输出(false就输出‘.’,true就输出’X’),如果没有粒子在范围内了就终止程序。

伪代码:

Class Particle

{int position;

int direction;}

List<Particle>particles=initialize particles

List<Boolean>hasParticles=initialize array with particles.size

int v = initialize speed

while(true)

{for each hasParticle, hasParticle = false

for each particle, if 0 <= position < hasParticles.

size, hasParticles[position] = true

print one line by hasParticles

if all hasParticles are false, return

for each particle, position = position + direction * v}

第二题:人间“雨人”

问题描述:

传说中 Hulu 有位 Hulugan 被誉为「Hulu 雨人」,Ta 有着惊人的数字能力,可以秒算出指定范围内符合某些常见性质的数的个数。

可是,时代变了,现在是信息时代,为什么不问问神奇的计算机呢?

Sophie 定义,如果一个数的每一位之和模 N 为 0,则称它为 Sophie-N 数。

现在 Sophie 想让你设计一个程序,可以快速计算出整数闭区间 [A, B] 的 Sophie-N 数的个数。

输入描述:

三个正整数 N、A、B

输出描述:

一个整数,代表整数闭区间 [A, B] 的 Sophie-N 数的个数

输入样例:

62 19260817 20210817

输出样例:

21

提示:

  • 对于 10% 的数据,1 ≤ N ≤ 100,1 ≤ A ≤ B ≤ 108

  • 对于 30% 的数据,1 ≤ N ≤ 100,1 ≤ A ≤ B ≤ 109

  • 对于 60% 的数据,1 ≤ N ≤ 100,1 ≤ A ≤ B ≤ 1010

  • 对于 100% 的数据,1 ≤ N ≤ 100,1 ≤ A ≤ B ≤ 1011

题目解答:

可以想到计算 [A, B] 区间的 Sophie-N 数的个数可以转换成计算 [1, B] 区间 - [1, A - 1] 区间中 Sophie-N 数的个数。

所以问题可以抽象成如何写出函数 f(m),函数 f(m) 代表计算 [1, m] 区间 Sophie-N 数的个数,由于 m 数字大小可以高达 1e11,我们可以自然地想到按位进行计算,即数位 DP。

令 f[i][j] 表示不超过 m 的情况下,前 i 位数的和模 N 为 j 的数的个数,从 0 到 9 枚举第 i 位数 cur,则:f[i][j] = sum(f[i - 1][((j - cur) % N + N) % N])。

进行状态转移即可,时间复杂度 O(NlogB),空间复杂度 O(NlogB)。

第三题:轻松职场

问题描述:

Hulu准备在办公室的某一个区域内举办一个大型活动,举办活动的设想之一就是希望找到一个区域让大家最方便到达。

Hulu办公室的布局非常简单高效。办公室存在N个区域(编号从1到N),区域里原本坐着一些组包含一定数量的人。办公室布局总共有N-1条道路方便相互通行,每条道路连接两个不同的区域,区域之间最多存在一条道路。布局还能保证两两区域之间都能相互到达,并且有且仅有一条路径,任何区域均可以被选择为活动点。

那么我们需要你帮助Hulu设计一个算法,为Hulu找到一个最便捷的活动点,并输出它的代价。我们定义代价为所有人到达活动点的距离的总和,那么你找到的活动点即为所有区域中代价最小的区域。

如果存在多个选择,任意一个均可。

输入描述:

第1行: 一个整数N

第2 .. N+1行: 对于每个第i+1行, 一个整数 Zi 表示编号为i的区域的人数

接下来N-1行: 对于每一行,三个整数A, B, C (以空格隔开)表示区域A到区域B有一条长为C的道路

(1<=N<=100,000,0<=Zi<=1000,1<=Ai,Bi<=N, 1<=Ci<=1000)

输出描述:

一个整数,表示最小可能的代价

输入样例:

5

1

1

0

0

2

1 3 1

4 3 3

3 2 2

4 5 3

输出样例:

15

题目解答:

阅读题目时我们很容易分析出这是在一张图里找一个中心点,所有点到它的加权距离和最小。

那么一个朴素的算法则是:

-计算两两顶点之间最短路(顶点i,j之间的路径长度,不妨记为Di,j)

-枚举每个活动点,计算代价

-输出其中最小值。

也即:

题目条件隐藏了一个要点:布局本质上是一棵树(虽然我们可以自定义其根)。相互到达表示连通图,无重边且边数为顶点个数减一将图降级为树。这样能简化一些最短路的计算,但是并没有降低求代价的复杂度。这也是优化的重点。

我们考虑已经计算完成了以顶点x为活动点的代价(记为Fx),相邻的顶点y的代价 Fy 如何利用这次计算的结果:

我们以Ex,y 作为分界,将图分成两个子树,不难看出,Fx和Fy的差值即转移活动点后,左侧子树所有的人要多走Dx,y的距离,而右侧子树的人要少走Dx,y的距离:

虽然求代价变得简单了,但是求子树总人数变得棘手起来,因为它受制于转移的方向(从哪个相邻的顶点转移到此顶点)。如果每次遍历到再计算,时间复杂度并不会优化太多。这时候树的结构优势便体现出来。我们不妨约定遍历的顺序为从根到叶,即顶点x为顶点y的双亲,再加上我们知道总人数:

所以,

也就仅仅需要知道子树的总人数即可。

那么题目的算法则变成:

-约定图中某个顶点为根,利用DFS遍历图,在回溯过程中:

-求得每个子树的总人数;

-求得以根为活动点的代价;

-代价计为当前最小值,从根往叶子节点开始遍历(BFS 或 DFS)

-每遍历到一个顶点,利用其双亲的代价,带入上述公式,求得自己的代价;

-每次遍历更新当前最小值

-输出最小值

这样时间复杂度和空间复杂度均为线性,能够完全胜任题目的数据范围。另外值得一提的是,抛去平凡的边界情况,数据说明了有些区域人数可能为0,所以有一些情况是有一点优化空间的。比如,在数据规模达到上限的情况下,仅有一个区域有人和仅有两个区域有人。

第四题:魔鬼迷宫

问题描述:

有一个矩形迷宫,包含m行和n列,可以用一个二维字符数组来表示这个迷宫,数组的每个元素可以是这些字符之一:'0' / '1' / '2' / 's' / 'e' / 'd'. (只会有一个 's', 一个 'e', 和一个 'd')

'0' 表示空,你可以达到这个位置;

'1' 表示这是一个恶魔士兵,你和魔鬼都不能到达这个位置,但是魔鬼可以穿过这个位置而你不行;

'2' 表示这是一个己方士兵,你和魔鬼都不能到达这个位置,但是你可以穿过这个位置而魔鬼不行;

's' 表示迷宫唯一的起点;

'e' 表示迷宫唯一的终点;

'd' 表示这里有一个魔鬼并且它足够聪明

(魔鬼会尽可能的阻止你穿越迷宫)。

你需要从起点开始,想办法到达终点,但是魔鬼也是可以移动的(双方士兵不能移动),你每次移动一次之后,魔鬼都可以移动一次,你和魔鬼轮流移动,从你先开始。

如何定义一次移动:每次移动只能选一个方向或者可以选择不移动。你每次可以往上下左右四个方向走s1步(0<=s1<=yourSteps), 魔鬼每次可以往上下左右四个方向走s2步(0<=s2<=devilSteps),相邻的两个格子定义为1步的距离,你虽然不能穿过魔鬼士兵,但是你可以穿过魔鬼,但是如果你和魔鬼在同一点(包括终点)你就会被魔鬼抓住。

在移动次数小于1000的情况下,请问你能不能走出迷宫(走到终点)并且不被魔鬼抓住,输出你从起点到终点需要移动的次数 (不能走出迷宫或者被魔鬼抓住都输出-1)

Constraints:

  • 0 < m < 10

  • 0 < n < 10

  • 0 < yourSteps < 10

  • 0 < devilSteps < 10

输入描述:

第1行:yourSteps,你每次移动最多可以走多少步;

第2行:devilSteps,魔鬼每次移动最多可以走多少步;

第3行:m,迷宫有多少行 (每行的长度相等);

第4 ~ m+3行:迷宫数组的每一行,包含n个字符

输出描述:

在移动次数小于1000的情况下,你至少需要移动多少次才能走出迷宫(从起点到终点),不能走出迷宫或者被魔鬼抓住都输出-1

输入样例:

3

2

5

0s000

00100

10001

d0200

0002e

输出样例:

4

题目解答:

其实这题乍一看是一个BFS搜索,但是唯一的问题是你如果移动的步子足够大是可以跨过魔鬼移动到一个新的位置,这种情况下BFS是处理不了的。

考虑到这个迷宫本身的状态信息(士兵、出口)不会发生变化,唯一有变化的是你的位置和魔鬼的位置,所以可以考虑用DFS来模拟双方的每一次移动,为了避免重复计算(可能不同的移动步骤可以达到相同的状态)可以添加一个全局的缓存,缓存的key就是你的位置和魔鬼的位置。但是有一点需要考虑的是DFS如果迭代的太深了可能会超时,虽然题目里边给的是移动次数1000以内能否走出迷宫,但是其实最坏的情况可能也用不了1000次,其实你和魔鬼的移动次数加起来最多不超多92次,你如果能赢,92次之内就能赢,所以可以限制DFS迭代的深度最多92次。

迭代的过程不能剪枝,因为你需要拿到最少的移动次数走出迷宫,魔鬼就算是输,也会让你已更多的移动次数来赢。

魔鬼可以选择不移动,但是你必须得选择移动。(不然肯定就走不到出口了)

有些情况是你可以比魔鬼率先到达出口并且不用跨过魔鬼移动,这些都可以用BFS来做一个优化,毕竟DFS时间长。

DFS pseudo-code

第五题:地狱三角形

问题描述:

在直角坐标系的 Y 轴上有两个点 A(0,1) B(0,-1),记为底边 AB。在第一和第四象限分布着 N 个点C1,C2,...,Cn.这 N+2 个点没有任何三点共线,需要从 N 个点中选出最多的点,使得他们作为顶点和 AB底边构成的三角形共 AB 这个底边并且相互只包含,不相交。(相交的定义为两个三角形的另外两边都不相交)

输出被选出的点的集合的大小

如图中,三角形 ABC3,ABC1,ABC4,ABC5 相互只包含不相交,而三角形 ABC1 与 ABC2 相交,三角形 ABC6 与其他每一个三角形都相交。

输入描述:

第一行是一个整数 N

第二行是 2N  个用空格分隔的高精度浮点数,表示每个点的横坐标和纵坐标

输出描述:

输出被选出的点的集合的大小

输入样例:

6

1 0.2 1.6 -0.6 0.6 0 2 -0.2 3 -0.5 0.2 1.05

输出样例:

4

题目解答:

将 N个顶点按照 ACi的斜率从小到大排序, 得到 N 个顶点的一个序列。如样例的数据,会得到 C3,C2,C1,C4,C5,C6; 然后按 BCi 的斜率从大到小排序,得到序列C6,C3,C1,C4,C2,C5。任意两个点 Ci Cj,如果在两个序列中出现的顺序相同,那么以他们为顶点构成的三角形相互包含;如果顺序不同,那么三角形相交。

所以这两个序列的最大公共子序列(以样例为例,最大公共子序列为C3,C1,C4,C5)即为最大的 N 个顶点的子集。

怎样以 O(n^2)时间求最长公共子序列,不在这里详述了,不知道怎么做的同学可以搜索相关资料。

最长公共子序列的时间复杂度为 O(n^2),但是这道题要拿到满分,需要的时间复杂度为 O(nlogn)。实际上如果两个序列中有一个序列中每个元素都只出现了一次,那么这个最长公共子序列问题可以转换成最长递增子序列问题,而最长递增子序列问题有 O(nlogn)时间复杂度的实现。

转换的方法为:首先选每个元素都只出现了一次的序列,以这个序列里元素出现的顺序对每个元素从 1 到 n 编号,然后对第二个序列把每个元素转变成对应的编号。

(样例中C3,C2,C1,C4,C5,C6依次编号为 1,2,3,4,5,6。那么C6,C3,C1,C4,C2,C5可以转化为 6,1,3,4,2,5) 然后对这个编号后的序列求最长递增子序列,该子序列对应的元素即为原来两序列的最长公共子序列。(1,3,4,5 为最长递增子序列,对应回元素即为 C3,C1,C4,C5)。

为什么重新编号后的序列的最长递增子序列即为原来两序列的最长公共子序列?原因也很简单,重新编号实际上保留了第一个序列的顺序信息,对第二个序列做编号的转换后,新序列里的所有递增子序列描述了原来两个序列的所有公共子序列,所以最长的那个递增子序列即为所求。

怎样以 O(nlogn)时间求最长递增子序列,不在这里详述了,不知道怎么做的同学可以搜索相关资料。

另外,这道题特意将A和B点放在了y轴上,这样是为了简化代码实现难度,有笔试者可能上过邓老师的计算几何课程,或者有一定的计算几何基础,实现了一个toLeft测试函数,在这道题目上实际上是不需要的。

长按关注Hulu

了解更多校招动态

Hulu2022校招 | 笔试真题及解法揭秘相关推荐

  1. 2018校招笔试真题汇总(javaC++)

    科大讯飞: 2018秋招笔试科大讯飞java笔试试题 https://www.nowcoder.com/discuss/67684?type=2&order=3&pos=13& ...

  2. 2018校招笔试真题汇总(java/C++)

    科大讯飞: 2018秋招笔试科大讯飞java笔试试题 https://www.nowcoder.com/discuss/67684?type=2&order=3&pos=13& ...

  3. 58同城2021校招笔试真题-前端

    58同城2021校招笔试-前端 以下代码输出: console.log([1,2,3,4,5].splice(1,2,3,4,5)); console.log([1,2,3,4,5].slice(1, ...

  4. 牛客网笔试真题 2021 阿里巴巴编程题(4星)题解(1-5)

    2021阿里巴巴校招笔试真题_Java工程师.C++工程师_牛客网 1.小强现在有n个物品,每个物品有x,y两种属性和.他想要从中挑出尽可能多的物品满足以下条件:对于任意两个物品 i 和 j ,满足( ...

  5. 百度2021AIDU产品精英笔试题型,百度历年笔试真题及答案解析

    百度2021产品精英笔试已发,笔试题型为 主观题1道 80分钟 数字推理 10题 10分钟 图形推理 10题 10分钟 资料分析 10题 10分钟 智力题 7题 10分钟 我用的是职题库APP练习的笔 ...

  6. 360 c语言 笔试,奇虎360校招的笔试真题

    选择题有45个? 好像是,三道简答题, 简答题: 1.设计一个课程表(包括目标人群.核心功能.特色设计); 2.说ATM的缺点,改进方法; 3.如何让李开复等互联网大牌关注你的微薄? 选择题记得不是很 ...

  7. vivo笔试题C语言,vivo校招笔试考什么?vivo在线测评笔试真题及答案解析来啦!...

    原标题:vivo校招笔试考什么?vivo在线测评笔试真题及答案解析来啦! 1 vivo校园招聘笔试简介 vivo2021校园招聘补录已经开启,今天嗖嗖就带大家看一看vivo历年在线测评笔试真题. vi ...

  8. C语言vivo笔试题目及答案,vivo2020笔试真题,vivo2020校招提前批火热进行中!

    原标题:vivo2020笔试真题,vivo2020校招提前批火热进行中! vivo2021校园招聘提前批 简历投递截止时间:2020年6月6日12:00 现在,你可以登录vivo校园招聘官方网站 ht ...

  9. 各大IT公司笔试真题汇总开发人员一定要加入收藏夹的网站(收藏)

    巨人网络java笔试基础题分享 http://www.coderarea.net/bbs/read.php?tid=834 百度笔试题 http://www.coderarea.net/bbs/rea ...

  10. 求职产品经理【十六】笔试真题串讲之百度地图与大数据结合的产品

    今天我们进入笔试真题串讲的第一节课,我会给大家详细讲一下需求分析题的答题技巧. 看一下下面这道题:来自百度的校招真题 请设计一款百度地图和大数据相结合的产品,产品形态不限(需要说清楚包括但不限于以下内 ...

最新文章

  1. 自学python还是报班-转行Python开发自学还是报班?老男孩全日制学习
  2. MxGraph从入门到精通之5:在Vue项目中使用MxGraph
  3. Mysql和Redis数据同步该怎么做
  4. layui option 动态添加_layui select动态添加option的实例
  5. PLSQL Developer导入csv文件到oracle
  6. 大河抽奖盲盒运营版 1.9.12开源版
  7. 有时候能讲出来,比沉默要好吧
  8. WinSCP 提示:你的Shell可能与本程序不兼容(推荐使用Bash)。
  9. php 导出csv格式的文件
  10. 小甲鱼python学习笔记1
  11. 酒店产生蜱虫原因及如何处理
  12. 新能源车牌识别算法,助力车牌识别核心升级
  13. c语言抖动算法,游戏中抖动(振动)算法的实现
  14. CAD二次开发学习笔记四(得到选中的实体,修改实体,如等分线段)
  15. c语言 simon 游戏,终于发现少儿英语游戏SimonSays(西蒙说)
  16. Binding的三种方式
  17. 高性能 低功耗Cortex-A53核心板 | i.MX8M Mini
  18. CSS十问——好奇心+刨根问底=CSSer
  19. 智慧物联网的运用领域
  20. 故障报修系统php,【假期挖坑】PHP综合报修系统 V1.0

热门文章

  1. 解决MySQL登录ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor)问题
  2. 测试网速_Azure AWS Google Cloud服务网速及Ping值延时在线测试
  3. 聊聊技术人的“绩效考核”
  4. 给全国高校本科招办的一封公开信
  5. DateTimeFormatter格式化 eee MMM d HH:mm:ss yyyy
  6. 2018.6清北学堂day6上午
  7. Python Decorator的来龙
  8. 不是 SELECTed 表达式
  9. PCL笔记二:PCD解析;PCD读取;PCD与XYZ转换;
  10. Go Anywhere Chair