头条18年校招后端开发工程师编程题解析
Posted 播妞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了头条18年校招后端开发工程师编程题解析相关的知识,希望对你有一定的参考价值。
前几天听一个学员说他去参加了头条的校招笔试,回来把试题和解析分享给播妞啦。我来分享给大家,好东西只有分享才能产生价值嘛!
有n个房间,现在i号房间里的人需要被重新分配,分配的规则是这样的:先让i号房间的人全部出来,接下来按照i+1,i+2,i+3,...的顺序依次往这些房间里放一个人,n号房间的下一个房间是1号房间,直到所有人被重新分配。
现在告诉你分配完后每个房间的人数以及最后一个人被分配的房间号x,你需要求出分配前每个房间的人数,数据保证一定有解,若有多解输出任意一个解。
输入描述:
第一行两个整数n,x(2<=n<=105,1<=x<=n),代表房间数量以及最后一个人被分配到的房间号;
第二行n个整数ai(0<=ai<=109),代表每个房间分配后的人数。
样例输入:
3 1
6 5 1
样例输出:
4 4 4
解析:
首先,如果所有房间都有人,这个问题很好考虑,找最小值,例如最小值是3,长度为4,那么就循环了3圈,然后从最后一个分配到的房间向前数,数到最小值数了多少下。例如样例中,第三个房间的人肯定是被请出去的,那么第三个房间的原本人数就是1×3+1=4,第一个房间的原本人数就是6−1−1=4,第二个房间原本的人数是5−1,那么我们就得到了一个一般的解法:先找最小值,然后所有房间的人数先减去最小值,再从最小值这个地方先后到最后一个分配的房间要再减一,最后最小值这个地方的人数就是最小值乘长度加上最后一个人分配的地方向前到这最小值这个地方的距离减一.
但是现在存在有的房间可能没人,这就意味着最小值可能有很多个,那么就要分两种情况了,一、最后一个分配的房间里的人数就是最小值,这种情况这个房间里的人就是先前被请出去了,也就是循环了theMin圈,很好计算;二、最后一个分配的房间里的人数不是最小值,那么先前被请出去的房间就是从最后一个分配的房间向前数第一个遇到的最小值的房间,自己画一个图就理解了.
完整代码:后台回复“tt”即可获取
给你一个矩阵,里面有‘#’,表示障碍,‘.’表示空地,‘S’表示人开始的位置,‘E’表示箱子的预期位置,‘0’表示箱子的初始位置,你的任务是把箱子从‘0’推到‘E’.
注意不能将箱子推到‘#’上,也不能将箱子推出边界;
现在给你游戏的初始样子,你需要输出最少几步能够完成游戏,如果不能完成,则输出-1.
输入描述:
第一行为2个数字,n,m,表示游戏盘面大小有n行m列(5<n,m<50);后面为n行字符串,每行字符串有m字符,表示游戏盘面.
输出描述:
一个数字,表示最少几步能完成游戏,如果不能,输出-1.
样例输入:
3 6
.S#..E
.#.0..
......
样例输出:
11
解析:
首先可以看出是一个bfs问题,推箱子的时候首先人要站到箱子紧挨的四个方向的格子中,才能把箱子推向某一个方向,因此,两个bfs,第一个bfs搜索箱子的位置,第二个bfs搜索人的位置到箱子紧挨的四个方向的格子要走的步数,大致方向就是这样,下面说下细节.
● 到终点时,箱子可以从四个方向推到终点,因此要维护一个最小 值,当然了,箱子可能并不一定可以从四个方向推到终点,这个 你 自己去判一下就好了;
● 我用了优先队列做优化,原因是人到箱子的四个方向的步数大小 不 一,因此我们优先选择总步数最小的扩展;
● 在第二个bfs中,要把箱子当成障碍物;
● 走过的地方不能再走,但是这里位置的唯一性要由人的位置和箱 子的位置共同确定,因此要开一个4维数组,不过我们通过hash可 以 降到2维;
●我们把方向按:上 - 0,右 - 1, 下 - 2,左 - 3编号,为的就是在 编码的时候可以方便统一地求人要走的那个位置和箱子即将推到的 那个位置.
完整代码:后台回复“tt”即可获取
二阶魔方又叫小魔方,是2*2*2的立方体结构,每一面都有4个块,共有24个块,每次操作可以将一面逆时针或者顺时针旋转90。,如将上面逆时针旋转90。操作如下:
Zero在小魔上做了一些改动,用数字替换每个块上面的颜色,称之为数字魔方。魔方上每一面的优美度就是这个面上4个数字的乘积,而魔方的总优美度就是6个面优美度的总和。
现在Nero有一个数字魔方,他想知道这个魔方在操作步超过5次的前提下能达到的最大优美度是多少。
魔方展开后每一块的序号如下图:
输入描述:
输入一行包含24个数字,按序号顺序给出魔方每一块上面的数字。所有数字的范围为[−100,100]。
输出描述:
输出一行包括一个数字,表示最大优美度。
样例输入:
2 −3 −2 3 7 −6 −6 −7 9 −5 −9 −3 −2 1 4 −9 −1 −10 −5 −5 −10 −4 8 2
样例输出:
8281
解析:
模拟题,最主要的是写出6个移动位置的置换群,仔细点写,我一开始写错好几次,太多了,本来想用代码来写,但是想了下,还不如手写呢,最后我是通过下面这个debug函数才找出来我哪个地方写错了,如果这个函数输出的全是1,那么数字上就没错,但是不保证你的置换方式有没有错.
void debug()
{
for (int i = 0; i < 6; i++) {
int a[24];
memset(a, 0, sizeof(a));
cout << i << ":" << endl;
for (int j = 0; j < 24; j++)
a[mp[i][j]]++;
for (int j = 0; j < 24; j++)
printf("%d ", a[j]);
puts("");
}
}
还要注意一点,这里顺时针逆时针只要考虑一个就好了,因为顺时针移动三次可以得到逆时针!
时间复杂度O(125)可以接受,不过这个题如果说在15步内那就不是这么简单的了,首先,15步去暴搜是不行的,太多了,那么怎么办呢,这个时候我们就要考虑魔方的“上帝之数”了,二阶魔方在任意状态11步内是可以还原的,那么也就是说,15步可以从任意一个状态到另一个任意的状态了,那么这个问题就变成了,24个数字分成6组,求这6个组的乘积最大和了,但是要注意一点,有些数字是永远不可能出现在同一面的,这个要考虑到,比如一条棱上的两个数字。
这样子考虑不用去模拟魔方转动了,但是好像这个问题变难了,贪心是肯定搞不了的,我也不知道做了.
完整代码:后台回复“tt”即可获取
请大家先做题再看答案!要当作自己在考试一样对待!
不保证对于以上三题给出的答案是不是最优解,如果有更好的方法大家可以一起讨论呐!
此外,播妞还为大家整理了一份更全的面试笔试题资源!
37道名企面试题
48道算法题
但是呢,播妞水平有限,这些题目的答案,播妞没能写出来,这个就留给你们自己去完成实现吧。
免费下载方式
关注‘播妞’ 回复:85
领取 播妞整理的面试笔试题资源
以上是关于头条18年校招后端开发工程师编程题解析的主要内容,如果未能解决你的问题,请参考以下文章