百奥 SDK开发工程师 一面凉经
腾讯会议,1h,两个面试官,问的特别刁钻,加上面试的过程中我舍友嫌我吵,一直在敲机械键盘,发挥并不好。
- 自我介绍
- 为什么想要投这个岗位,为什么不投Java后端的岗位呢(内心os:你们只有这个啊)
- 你对SDK有什么了解
- 挑一个项目讲(数据库)
- 解析SQL语句的过程是你自己写的吗(不是,自带的,用到了一些开源的框架)
- 你的事务需要回滚,怎么实现(实现了redo log和undo log,当事务开始的时候会在日志里面记录,回滚时候只需要找到事务开始的日志,回滚就行了)
- 实习经历
- 如果有新版本你们怎么发版,会影响到正在使用的用户吗
- 怎么用数组去实现一个栈(一开始想到数组实现队列的方式,说了两个指针,栈顶指针和栈底指针,后面想起来只需要栈顶指针就够了)
- 如果要扩容呢(开辟一个更大的数组,然后将原来数组里面的所有值复制到新数组)
- 那怎么复制(就一趟for循环遍历,我还以为是这个栈只能有push和pop操作不能随机访问,正想说就被打断了)
- 如果我们需要随时读取栈里面最大的一个元素,但是不能pop和push,你会怎么实现(开辟一个辅助数组b,b[i]表示栈大小为i+1时栈的最大值,每次push一个新的元素x,就令b[i] = max(b[i-1], x))
- 这样子的话数组里面肯定是会包含许多重复的值的,应该怎么进一步优化?(可以使用链表,链表里面存储【当前栈容量 + 当前的最大值】,如果push操作使得栈的最大值改变的话,就在链表里面追加一个节点,如果不改变的话就不需要,pop操作的时候如果链表尾部节点保存的当前栈容量=当前栈容量,就在链表尾部移除节点,这样子每次取最大值的时候就可以直接取链表尾节点保存的最大值就可以了)
- 你的链表应该是单向还是双向(我说了双向,实际上单向也可以,如果单向的话就必须要头插)
- 那你为什么不使用数组实现呢?用链表实现有什么优势(我们没办法预判栈之后push的值是什么,所以使用数组的话我们没法估计到底要开多少,当然这个数组开的容量跟栈的容量一样,是没问题的,那这样我还不如直接用第一种方式)
- 有没有玩过羊了个羊,你觉得他的玩法有什么特点(?)
- 那他客户端和服务端的通信,是用TCP还是UDP(我觉得他是TCP,他通信就只是在游戏结束上传成绩的时候)
- 从UDP和TCP区别的角度,说明一下为什么不采用UDP(UDP是不可靠传输)
- 像直播这种对网络要求比较高的场景,为什么还使用UDP这种不可靠的网络进行传输(TCP头部开销大,并且直播频繁发送数据的,如果使用TCP会使得网络传输的数据量增大,而且即使丢失一两个包,对于接收结果也不会产生太大影响)
- 刚刚那个游戏,你觉得他TCP采用长连接还是短连接(短连接吧)
- 采用短连接的话你觉得游戏结束之后应该上传什么数据给服务端呢
- 服务端你觉得怎么做防作弊(开始游戏时客户端向服务端获取一个UUID,游戏结束后上传成绩的时候带上UUID,服务端再做校验)
- 如果上传游戏的时候网络被劫持了呢,把分数改了呢(可以对整个要上传的数据全部一起进行加密,跟着一起上传,服务端接收到请求的时候再对收到的数据采用同样的方式加密,检验两个加密后的结果是否相同)
- 那如果我直接改内存呢(游戏的分数是保存在某一内存中,我觉得可以在多几个内存中保存同样的数据,或者对分数进行复杂运算、加密之后保存到另一块内存中,之后再检验)
- 那你这样只是增大的修改的难度,还是不能根治,还有没有更好的方法(没有)
- UDP不可靠,那怎么在应用层实现让UDP可靠(MD5、校验和)
- 但是你这样只能检验发送过来的数据是否正确,但是我们可靠还需要是有序的,怎么实现(自己在应用层实现滑动窗口机制)
- 什么是滑动窗口,为什么用滑动窗口就可以可靠(滑动窗口可以保证在窗口之前的都是已经到达的,在窗口内的都是正在传输的)
- 代码怎么实现滑动窗口
- 采用TCP和在应用层实现可靠的UDP,对于你的系统而言有什么区别(系统复杂性增大)
- 那在应用层实现UDP会有什么优势(程序员可以根据自己喜好定制?)
- 你对我们公司有什么想了解
- 这个岗位做啥(做游戏移动端的模块比如登录、支付)
- 培训机制(有培训课程,一对一导师)
- 技术栈(分为安卓和IOS,Java和ObjectC)