笔试是在5月6日晚间完成的,试卷标题上写着“零散批”,估计是因为投递简历太晚了。

笔试情况前文已经说过,3题我做出来俩。11日收到预约面试通知,让我选择一个时间进行面试。网易的面试预约流程是我感觉最好的,首先是可供选择的时间比较多,有4个,分别是12日和13日这两天的上午9:30和10:30;其次是操作比较简单,去官网选一个时间就行,别家的面试都是打电话/发邮件,用自然语言沟通。

面试流程也如同预先通知的那样,是半小时代码+一小时交流。

算法

一共出了3个算法题。

题目1:数组最大距离

这是一开始那半小时的代码题。

定义两个数组A, B之间的距离是 max ⁡ { ∣ a − b ∣ ∣ a ∈ A , b ∈ B } \max\{ |a-b|| a\in A, b\in B\} max{∣a−b∣∣a∈A,b∈B},即两数组里各挑选一个元素,差值的绝对值的最大值。
实现一个函数,输入m个已经按升序排好的数组,输出它们之间的距离的最大值。

这题看起来是出乎意料的简单,只要把最大的和最小的都找出来就可以了吧。而且顺序已经都排好了,找到他俩只需要 O ( m ) O(m) O(m)的时间遍历一遍所有数组的首尾元素。

然后我发现没有处理一个特殊情况,就是最大和最小元素在同一个数组里。于是我引入了次大和次小元素。由于最终使用的最大值不可能是某个数组里的次大值(肯定不如用最大值好),小的方面同理,所以这里的次大/次小指的是所有数组的最大/小值里的次大/小值。

很快我就写完了,半小时还剩下大概15分钟。我看来看去,想不出可以改正的地方,面试官也还没发起语音通话,于是剩下的时间就磨蹭过去了。

后面面试官问我思路,我就如实告知。

题目2:等概率随机排列

输入一个数组,输出它的一个随机排列。要求该数组的所有排列能等概率地出现。

我一看是大喜过望,因为几个月之前看《算法导论》的时候,开头就讲到这个问题,并且讲到高德纳提出的一种非常高效的算法:洗牌算法。这算法过于巧妙,以至于我后来又看了好几次,一直记到今天。

于是我很快写了大概的代码:

void RandomShuffle(vector<int>& m){int n = m.size();for(int i=0; i<n; i++){int j=rand(i, n);swap(i, j);}return;
}

实际上很有瑕疵,比如我不知道在{i, i+1, ……, n-1}里取一个随机数具体应该怎么写,比如我swap的参数错了……

不过面试官没有纠结这些细节,而是让我用数学的方法证明这样是对的。

我当初看这个算法的证明看了不少次,印象还算深刻。分情况一讨论,很快就说明了每个数字出现在每个位置的概率都是 1 / n 1/n 1/n。

我突然又想到,即使每个数字出现在每个位置的概率都是 1 / n 1/n 1/n,结果也未必会等概率地输出所有排列。
比如,一个算法把所有元素都往后移动随机位数,越界的就循环地补到前面,这样也能满足上面说的概率条件,但能输出的排列只有 n n n个。《算法导论》书上有这道习题,我看到解答时惊讶不已,于是明白了应该严格证明所有排列都可能等概率地输出。

但面试官并没有继续追问,我也只是想到了证明的不足,并没有想到怎么完善……就没再多嘴)

题目3:设计定时器

实现两个函数:
void RegisterFunc(int time, void* Function);
该函数输入一个绝对时间和一个函数指针,功能是将一个函数注册进定时器。
void UpdateTimer(int time);
该函数输入当前的时间,功能是触发定时器,将所有已经注册进定时器的、对应的绝对时间小于当前时间的函数拿出来调用。如果有多个函数被找到,则按时间顺序调用它们。
实现基本功能后,考虑两种极端情况:RegisterFunc被频繁调用;UpdateTimer被频繁调用。

具体怎么调用的细节应该是不重要的,最主要的是如何降低两种操作的时间复杂度。那么核心的问题就是如何设计定时器的数据结构,使得每次注册和每次触发都能很快完成。

我首先想到的是队列,因为已经注册的任务是按照时间顺序调度的,和队列的性质差不多。
队列的缺点也很明显:要实现在中间插入而非尾部插入,我只能想到用链表,那么每次插入都可能要 O ( n ) O(n) O(n)的时间;每次触发也要从前往后遍历,时间也可能要 O ( n ) O(n) O(n)。

那么能不能在链表之外多一些指针,指向链表中某些节点,每两个指针之间都有固定的时间间隔呢?这恐怕还是同样级别的时间复杂度,只是常数项会随着额外指针的密度增加而降低。

如果要降低时间复杂度的级别,似乎要给这些额外指针之外再增加指针,一层层不断地加,一直加到只有一个为止。我隐隐感觉,这对应某种树的结构,像是n叉搜索树之类的……但这种高级数据结构我了解的特别少,于是只能勉勉强强说思路说到这里为止。

小题:快排的原理

这也是老题目了,没什么好重复的。无非是说说快排的过程,最坏情况,如何避免,中间元素的选择方法……之类的罢了。

操作系统

一如既往地不会。

但这次面试官甚至没有提问,而是让我知道啥就说啥……我就说了堆和栈的区别和这种区别的意义之类的比较基础的内容。

网络

又是经典题目:三次握手,四次挥手。我虽然没学过计网,但这题我都快背烂了,因为问的实在是太多了……

其他

让我介绍一下自己最熟悉的项目,问了一下其中的细节。这基本也是每次面试都会问到的题目,我也越答越熟练了。
不过这次面试官借题发挥。他问我,如果你的应用要同时给成千上万用户推送的话,服务器容易宕机,有什么办法解决吗?我一时语塞,实在没辙,勉强说了个“把用户分类”的方法。
关于游戏:面试官并没有提问太多,只是知道我喜欢玩炉石,说了一句“炉石是需要很多计算的”。我立即有很多话想滔滔不绝地说出来,比如炉石在技术和运气之间做到很好的平衡啦,炉石给硬核玩家准备的特殊环节啦……但我说到一半,感觉他似乎不太想听,只是想随便提一下而已……于是就住口了。
我对炉石的架构有这么多理解,也许我应该去试试游戏策划的职位,而非开发工程师。
初次之外,几乎没有关于游戏的问题。我还有很多关于游戏的优缺点的头头是道的分析没说出来呢。

网易2021暑期实习 游戏开发 一面相关推荐

  1. 网易2021暑期实习 游戏开发 笔试

    昨晚参加的网易的这次笔试,是我做过所有应聘笔试里最容易的.两个半小时,才3道题,难度较高的只有一题. 题1:printf中的if 小易刚学C语言,学了if和printf,他想自己写一个printf函数 ...

  2. 暑期Android游戏开发——小兔子跳铃铛(附源码)

    暑期Android游戏开发--小兔子跳铃铛(附源码) 一. 背景说明 我在南京的一所高校学习软件工程.学院里每年会举行一次"创新杯"软件比赛,鼓励同学自主学习和创新.我和几个好兄弟 ...

  3. 网易游戏2021暑期实习生 游戏运营管理面经 已拿offer

    今天晚上接到hr的电话 offer会下周发到邮箱 今年的暑期实习算是告一段落了 来这里写一些自己的经验吧 我投递的是杭州的游戏运营管理岗 经一位同学内推 4.17一面 4.28二面 4.30三面 5. ...

  4. 腾讯和网易相继投资海外游戏开发公司

    我国两家游戏开发巨头继续增加对海外游戏工作室的投资.这两家公司已加紧向海外扩张,以应对国内增长放缓局面. 日本游戏开发公司FromSoftware Inc.的母公司表示,全球最大的游戏公司腾讯控股有限 ...

  5. 网易视频云:游戏开发性能优化经验总结

    网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,为客户提供稳定流畅.低时延.高并发的视频直播.录制.存储.转码及点播等音视频的PaaS服务.在线教育.远程医疗.娱乐秀场 ...

  6. 字节四面-暑期实习后端开发

    文章目录 字节一面 字节二面 字节三面 字节四面 流程: 3.2内推,3.3收到一面通知,无笔试 3.8号一面,次日hr发邮件通过 3.17二面,次日hr发邮件通过 3.23三面,3.25hr通知三面 ...

  7. oppo C++软件开发2021暑期实习一面+HR面(已offer)

    无笔试 一面 不到半小时 1. 自我介绍 2. 项目详细介绍+提问 3. tcp三次握手 4. udp和tcp最大的区别 5. 说一下mqtt(项目有用到) 6. 说一下mqtt的优势,就还是说广播/ ...

  8. 2022.3.17网易暑期实习游戏研发岗第一题

    第一题是33的锯齿数独,不了解锯齿数独的可以先百度.大概意思就是nn的数独除了保持一般数独的特性之外,还要求各个宫(n个格子构成的连通区域,n*n的数独就有n个宫)也满足数独行/列的特性.然后给出数独 ...

  9. 后端开发面试自我介绍_字节跳动暑期实习后端开发面试经历

    字节跳动后端实习是什么,字节跳动后端实习面试流程是怎样? 今天小编就来帮助大家了解一下字节跳动后端实习面试到底有什么内容. (好了不皮了,开始正文) 字节的面试流程总的来说还是挺享受的,和面试官两人的 ...

最新文章

  1. MPO文件类型解码(四)3D图像整体结构
  2. 李菲菲课程笔记:Deep Learning for Computer Vision – Introduction to Convolution Neural Networks
  3. mysql大表join小表速度很慢_mysql多表join中,为什么子查询会那么慢,怎么解决-问答-阿里云开发者社区-阿里云...
  4. 怎么配置SQLServer2005以允许远程连接
  5. settimeout(fn(),0)
  6. python selenium firefox使用
  7. dsu on tree(Educational Codeforces Round 2: E. Lomsat gelral)
  8. c语言if怎么结束_07if与循环案例超经典C语言
  9. Python,入门1
  10. c#中excel文件怎么转换为dbf文件
  11. HTML静态网页我的家乡,html网站家乡 !
  12. Android Backup功能之全面实战
  13. 微信小程序:图标的使用(icon)
  14. 青蛙跳石头java_Java青蛙跳台阶问题的解决思路与代码
  15. Java流程控制相关知识(四)
  16. 10a大电流稳压芯片_高压dc48v降12v10a大电流降压ic详解
  17. springBoot防重复提交
  18. 简介:cs224n 2022 winter [Chris Manning]
  19. 注册表(Registry)
  20. PLsql中设置登录用户和密码

热门文章

  1. lstrip在python中是什么意思_映月城与电子姬 憋住作用是什么 憋住作用介绍
  2. 软件架构师 第一部分 基础篇 第六章 架构特性的范围
  3. 自从会了Python之后,我就没用过PS了!3秒带你将照片变成素描图片!
  4. 信息系统项目管理师(2022年) —— 第 2 章 信息系统项目管理基础
  5. FLASH的基础知识
  6. Activity的启动与管理之图记表查
  7. Substrate之旅4:基于Substrate私有链的搭建
  8. 第11节 Kali Linux系统网络信息查看与配置
  9. 数组的操作——查表法
  10. Jmeter基础入门教程【2】--界面介绍及常用配置项