前言
提前声明,此次面经过于离谱,可能不具备参考性
本人就读于某辣鸡双非,大三在校,小菜鸡一个
期末考完后就时不时逛一下Boss直聘,看看有没有合适的实习岗位,本来提前看好了维塔士的C 客户端开发实习,奈何已经停止招聘了,只能继续寻找其他中小厂的实习。
投了几个手游和端游小厂(我这水平大厂门都没有),有些压根不回,有些要了简历就没有下文了,只有一家做端游代理的小厂直接就发来了线下面试邀请,岗位是C 游戏开发,后端服务器方向(其实客户端也有涉及)。看了下待遇啥的都还能接受(饿不死就行),问了问大概要考察的内容,回答就是简短的“技术”,讲道理当时是比较慌的,毕竟这两个字包含的东西太多了。
约了第二天面试,再恶补八股也来不及了,就随便看了看面试注意事项,稍微改进了下简历,印出来后直接就去了。
笔试
提前半小时到了公司,跟前台小姐姐说明来意后让我坐在前台大厅的小桌子边等,几分钟后拿来了申请表与笔试题,时间90min。本来是14:00开始,但我提前去了就直接就让我开始答(所以说提前到还是有好处的)。
客观题
题目记不全,大概是以下这些:
- 编程语言:C/C 基础语法,内存分配,面向对象,指针(基本都会)
- 数据库:sql多表查询(蒙的,好像答错了)
- 游戏相关:网游工作原理流程图(不会)
- 英文题:三道选择题,都是简单的C/C 题目,参考第一条
编程语言部分:
- 内存分配主要就是考察
malloc
和sizeof
,会与指针一起考 - 指针大多是对象指针/引用,函数指针,字符串指针这些,会与面向对象一起考
- 面向对象算是考察的重点,涉及构造与析构顺序,运算符重载,拷贝构造这些
客观题难度其实比我想象的低很多,感觉跟学校的C语言期末考试比起来也就难了50%左右(辣鸡双非的期末真的是有手就行)。可以说只要把C/C 基础知识学完就能答个六七成
主观题
就一道,写出你的网游经历与对外挂的原理分析
。
这个属于自由发挥,我经历写的ow,csgo,pubg,糖豆人这几个,主要是便于外挂分析,以我的回答为例(瞎扯,图一乐就行):
- ow的外挂主要是透视 自瞄,原理就是对数据包的拦截以及解密,把敌人坐标及技能状态读取出来,再配合鼠标移动模块实现。
- csgo的外挂除了透视自瞄外还有延迟挂,假身挂这些,要想实现除了单纯拦包解包外,还需要伪造客户端数据包欺骗服务器。
- pubg的外挂更是重量级,有瞬击,范围,子弹追踪,上天,遁地这类变态功能,这是因为pubg把很多应该由服务器负责的判定放在了客户端,所以外挂可以伪造出更多的数据包,后续官方也在数据包中加入“暗桩”来识别这些伪造的包
(然并卵)。 - 糖豆人初期外挂泛滥则主要是将内存数据完全裸露在外,甚至通过ce这类内存修改工具就能实现飞天加速这类变态功能,后续反作弊系统上线后才将裸奔的内存数据隐藏起来。
重难点
只记录我认为的重/难点,水平有限写的比较烂,如果代码有错误欢迎评论区指出
1.编程实现十进制转十六进制,不得使用已经定义的库(string也不行)
分析:就是纯手撸实现进制转换,先十转二,再二转十六即可,因为不能用string,所以用char数组实现。大体思路就是把整数每一位拆出来存到数组里,然后转换,注意二转十六时位数要补齐到4的倍数,否则会出大问题
代码语言:javascript复制#include <iostream>
using namespace std;
int bindex=0,hindex=0;
char res[1050];
char bnums[10050];
void DtoB(int num) //十转二
{
while(num)
{
bnums[bindex ]=num%2 '0';
num/=2;
}
}
void BtoH() //二转十六
{
char hnums[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
while(bindex%4) //如果位数不足,则补齐
bnums[bindex ]='0';
for(int i=0;i<bindex;i =4)
{
int h=(bnums[i]-'0')*1 (bnums[i 1]-'0')*2 (bnums[i 2]-'0')*4 (bnums[i 3]-'0')*8;
res[hindex ]=hnums[h];
}
}
int main()
{
int n=0;
cout<<"输入十进制数:";
cin>>n;
DtoB(n);
BtoH();
cout<<"转为十六进制后:";
for(int i=hindex-1;i>=0;i--)
cout<<res[i];
}
这题其实我是答错了的,我当时写的代码只能运算偶数,奇数直接自动忽略结尾所有的0(感谢技术官不杀之恩)
代码语言:javascript复制2.请说明以下两种循环的优缺点
//1.
for(int i=0;i<100;i )
{
if(condition)
do1();
else
do2();
}
//2.
if(condition)
for(int i=0;i<100;i )
do1();
else
for(int i=0;i<100;i )
do2();
不太会,写的是第一种适合condition不固定的情况,第二种适合condition固定的情况,有老哥知道的麻烦评论区告诉小弟orz
代码语言:javascript复制3.实现对象的构造函数、拷贝函数、析构函数、复制函数(重载运算符)
class Test
{
public:
Test(char* cptr = NULL) { } //构造函数
Test(Test& test) { } //拷贝函数
~Test() { } //析构函数
Test operator &(Test &test) { } //重载运算符
private:
char* ptr;
};
题目记不太清了,我答得也记不太清了,反正是跟指针一起考的,这题我也蒙的很,写是写完了,但总感觉有几个写的不太对,具体哪里不对又说不上来(毕竟没法现场编译),指针内存这块知识确实还有待提升。
面试
这是最离谱的一部分,笔试答完后把卷子交给前台小姐姐,然后小姐姐领我进了一间会议室,等了一会技术官进来了,让我做个自我介绍,然后就拿着简历和笔试卷子看,等我介绍完后(大概50s),又盯着简历和卷子看了一会,直接就说答得还可以,可以要(???) 全程甚至可能不超过5min,我直接傻掉,本来觉得笔试挺简单的,重点可能会在面试,结果面试只是走个过场,只要笔试过关直接就发offer了。。。
整体感受
之前投的几个大厂给我整自闭了,下意识以为所有的开发岗难度都不会低,结果现在才知道,小厂难度确实不高(仅限实习),不管是笔试还是面试,难度跟大厂比起来真的天差地别。不卡学历,不卡项目,不卡工作经验,只要在校课程认真学基本都能过,感觉小厂更注重努力和学习态度,不一定需要特别出众的技术(也可能这是特殊案例)。 这次面试之前,也没有特别的准备,除了略微修改简历外,也就准备了一小段自我介绍,模板就是学校 专业 兴趣 做过的东西(比如我就说搭建了个人技术博客),200字左右,说完也就1min不到。 本来刚到公司的时候还比较紧张,笔试题一发反而冷静了,就当是一场难度稍高点的校内考试,整个流程也很顺利,技术官和前台小姐姐都挺好的,完全没有感受到压力。
心得
虽然说笔试题不难,但其实后期复盘还是有很多当时没发现的错误,这次走下来感觉线下笔试要比线上oj简单不少,毕竟oj错了就是真错了,线下的话可能技术官会有意无意忽略掉一些小错误。 主观题一定要尽可能多写,虽然不能加更多分,但最起码你的态度能让面试官看到,哪怕跑题了,也不会留下什么不好的印象,毕竟一张满满的卷子交上去,哪个面试官看了都觉得你有认真在答。 还有就是这笔试的时间其实蛮吃紧的,90min我几乎全程都在答题,就这样也只是刚刚答完,如果算上提前发卷的话,我的作答时间已经是超时的了(再次感谢前台和技术的不杀之恩)。
差不多就这些了,这次也算是我的第一次面试,之前投的大厂除了挂笔试就是挂简历,属实给我整抑郁了,这次也算是多多少少找回了点信心,有跟我一样是双非的同学如果技术不是特别出众又想找实习的话,建议把目标放低一点,可以多看看那些中小厂