三个月面经分享
大专软件专业大二,找的实习工作,3月1号开始投递简历,携程二面凉、好未来题题拍二面凉、奇安信,图森一面凉、滴滴offer、CVTE hr面凉、好未来学而思1对1、ThoughtWorks 、百度...
简历投递
投递软件 BOSS 直聘、实习僧、牛客网,校招巴士公众号定期会发一些内推码,我最开始在 Boss 先沟通了几家, 发送内容大概就是请问您招实习生吗,发简历照片版(谁有闲心点开看),显示已读但一家回复都没有,就改成发作品链接和博客链接(你看到链接难道不想点一下吗),开始有几家公司要我的简历了
- 多投
- 没面试机会不多投还能怎么办
- 多复盘
- 即使面试通过了
面试准备
-
自我介绍
- 我的自我介绍模板大概是这样的仅供参考:我是谁 + 学校 + 年级 + 简单提下项目 + 有写博客的习惯 + 比赛 + 学习的主要方式
-
熟悉自己的简历上的技能、项目
- 项目的初衷,难点,做了哪些优化...
-
刷算法、看面经查缺补漏
-
面试不是考试,没有那么严格的要求,不要太死板
-
提前熟悉一下面试平台(牛客网、赛码网)
-
不要打断面试官说话、不要和面试官争论
-
写博客是个加分项,有两家公司没让我手写代码,我问都说看过的我的博客和项目代码,说面试只是来看看我的反应和知识掌握的是否扎实
在携程面试前我经历了大概 7 次电话面,1 次视频面(offer),电话面挂了一个,这家我每次回答完问题,都要等个 2 ~ 3 秒(电话面这个时间是很漫长的,特别尴尬)面试官才会有回复,之前电话面也没经历这个情况,一脸懵,在这之后电话我回答完问题都会补一句您好,我回答完了,其他到岗时间不合适,面试的时候还是三月份,等到六月末离校太久了,加了我的微信。
携程一面 4月8日
投递简历后会收到一个行测的邮件,3月31日收到笔试邀请,看下状态显示的还是简历初筛不合格,4月1日笔试两道算法,第一道通过,第二道68%,4月4日收到一面的邀请
-
怎么判断数组类型
-
什么是闭包,使用场景
- MDN 上定义
- 个人理解
- 作用
- webpack 打包之后的代码都是一个又一个的立即执行函数
-
http 状态码
-
get 和 post 请求的区别
-
跨域
-
从输入 url 到页面渲染过程
-
http 和 https 的区别
-
给你一个网站怎么优化 seo 排名
-
响应式页面,请求多个图片怎么优化
-
有做过图片压缩吗
-
React的生命周期
- 我先说的 React 15 的生命周期,然后说那几个在 React 16 中为啥删除了,React 16 新增的生命周期又是干啥用的 React 生命周期详细梳理
-
算法:无序数组,遍历一次,取出第二大的值(说思路)
- 我想了十几秒吧大概,说了句没什么思路(大脑有些空白,都不说话,静止感觉很尴尬)
- 面试官说不急
- 我又想了几十秒说取出数组前两个元素比较大小,大的先当成最大的那个数,小的当成第二大的数,遍历,如果最大数小于那个就替换,第二大的数就替换成第一大的数
- 面试结束后,回想我应该提一下数组长度小于 2 怎么办,有重复元素怎么办
let arr = [9, 1, 1, 6, 3, 4, 5];
let max1 = arr[0] > arr[1] ? arr[0] : arr[1];
let max2 = arr[0] > arr[1] ? arr[1] : arr[0];
for (let i = 2; i < arr.length; i++) {
if (max1 < arr[i]) {
max2 = max1;
max1 = arr[i];
} else if (max2 < arr[i]) {
max2 = arr[i];
}
}
console.log(max1, max2);
- 未来规划
- 在学校怎么学习的
- 反问
第二天收到二面邀请。
面试时长35分钟
携程二面 4月13日
-
你有对自己的项目做过什么优化吗?(没有自我介绍)
- 瞬间人傻掉了,开始紧张,第一次有人问我这个问题,因为之前的面试几乎提不到项目,我以为实习生不看重项目,老半天一直在想项目写了啥
- 尬聊... 提到 webpack 就说了代码分割,问我怎么实现,我说我不记得了啊,webpack 配置那么多,没去背过啊,不过写过一篇关于 webpack性能优化的文章,让我发了一下链接
-
手写 EventEmitter
- 不知道是啥,先看了一下案列,写了两行代码,发现不对,又询问了一下功能,刚滤清,面试官说时间不多了,问一下思路,又出了道算法
-
- 时间不多了,说思路就行,不用写
面试时长40分钟
面试结束之后很抑郁,平时再努力一点也不会挂在这,本来机会就少,真的是给我机会也我不中用啊...
4月21日变成 hr 面试中,还以为自己过了, 看牛客网上也有好多同学一起变的状态,结果我过了一天再看就进人才池了, 人家打电话 OC 了
不过也很感谢携程这次面试让我发现自己不足,补充了一些前端性能优化的知识,总结了一篇前端性能优化的指标和工具,也锻炼了我的心态,让我在之后面试中不那么紧张、表现的更好
好未来题题拍一面 5月8日 11:00
实习僧上投递的
面试官先做了一个自我介绍,说今天面试的大概内容,大概分分为五个模块, js、框架(看你项目都是用 React 写的,就以 React 为主吧)、数据结构和算法、网络,剩下一个不记得了
-
自我介绍
-
TCP/IP四层、OSI网络七层、TCP/UDP 在那层
-
快排
- 先说的基本概念,然后说数组趋近有序怎么办、数组中有大量重复元素怎么办
-
项目遇到的问题,难点
-
Promise 捕获异常 react 路由跳转回原页面
-
React 生命周期
-
React 16 和 15 中 diff 算法的区别
-
我看别的同学都主学 Vue,你为啥主学 React
9分57秒
面试官那我在问一道题我们就结束吧
我:啊,咋这么快?
面试官:我一面主要是基础,React 我也不是很了解
-
1 到 100000 中有多少个 8
-
暴力一下 50000
-
还有其他办法吗
-
提到位运算我说我不会位运算
-
1 到 10 有 1 个 8,1 到 100 有 20 个 8, 1 到 1000 有 300 个 8 ... 1 到 100000 中有 50000 个 8
-
然后让我等二面
一面反馈: 基础扎实,善于思考,有开源项目,擅长react技术栈,
奇安信负责人面 5月8日 14:00
BOSS 上直接投递的负责人,所以直接就是他来面试我了
-
自我介绍
-
你主要做什么啊?
- 没听懂
-
主要 PC、移动、小程序还是哪方面的工作?
-
我说我都了解过,PC 端 React 写的多一些,在校主要还是想打好基础...
-
面试官:行吧(求我心里阴影面积,尬聊开始...)
-
-
const let var
-
ES5 实现 const
-
CSS选择器权重
-
CSS3 新属性
-
盒子阴影 内阴影,文字阴影
-
Promise 讲讲怎么用的
-
虚拟DOM
-
diff 算法
-
聊聊项目,优化
大概就记得这几道问题了,然后靠算法,其他的印象都比较开放(我听不懂想问啥),我几乎每次回答完问题, 面试官的回复都是 行吧
-
你做一道中等难度题多长时间? 我那不得看啥题吗...
-
你比赛多长时间、多少道题?
三道算法,循环矩阵、回文字符串切割,一道二叉树,三到简单题最对一道就 OK,十分钟之内做出来就通过做,之前做过与循环矩阵类似的,结果牛客出问题了,说有人把我踢出来了,我重进去牛客网提示说有人在面试,我人傻了,然后换成腾讯会议了
让我用记事本写防抖、节流
function debounce(fn, await) {
let timer;
return function(...args) {
timer && clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
clearTimeout(timer); // 当时没清,后来想想该清的
}, await);
}
}
function throttle(fn, await) {
let timer;
let flag = true;
return function(...args) {
if(flag) {
flag = false;
timer = setTimeout(() => {
fn.apply(this, args);
flag = true;
clearTimeout(timer);
}, await);
}
}
}
面试官:行吧(这个语气好的怪...行是不行)
面试官:你还有什么我没发现的优点吗(看来是不行)
我:这还能自夸的吗
...
面试官:有啥兴趣爱好吗...平时不打游戏吗
我:大一时候打啊
面试官:啥段位
我: 星耀啊
面试官:大一,四年前吗
我:我才大二,那来的四年前
面试官:额,尴尬了,这岗位是招应届生的,我问的都是工作相关的问题,武汉有个线下互选是招实习生的
我:还有课啊过不去啊
面试官:然后和我说因为我的学历问题没有面试机会让我重点突出一下比赛
我:我写了,您也不知道是啥啊
面试官:您管他知不知道那,你说是算法类,我去搜一下不就知道了,然后加了一个微信,说让我明年有机会直接过去...
在这之后我的自我介绍都会提一下比赛
好未来题题拍二面 5月8日 18:00
-
自我介绍
-
你大学最有成就感的事情
-
大学平均分
-
爱好
-
leetcode 第一题、大数相加、合并对象(深拷贝) 三选一
-
我当然是选第一个啊,问思路
-
在原有问题又变了一下形,
-
写完,面试官说你觉得我们是在考算法吗?然后说我们在看你的代码能力...
-
-
OSI 七层
-
表示层是干嘛的
-
有操作系统这门课吗
- 没有啊...
-
进程的由来
-
不知道啊,只知道进程和线程是什么...
-
面试官说了一下面试评价:我能看出你代码很熟,你也花了很多时间,但是,这些都是在表象层上,而那些底层的东西才是最重要的能一直伴随你成长的
-
反问聊了一会
-
您有计算机操作系统相关的书推荐吗,我看到过几本,都那么厚
-
你看到最后的那本就是我就要推荐的那本,我的导师曾和我说过欠下的债迟早是要还的
-
-
你怎么看待你的学历的问题
- 学历低可以专升本啊
面试反馈: 不建议录用,前端基础良好,计算机基础功课需要加强,明年有接本计划, 最快毕业也要3年后。虽然能胜任暑期实习生,但3年后正式录用的风险较高。
我现在说我其实不想升本,还来的及吗,真的不想升...
CVTE 一面 5月13日 10:00
4月27日在官网做的笔试,两道编程题,洗牌算法和层序遍历(不能用本地编译器,也不知道写的对不对),其他是多选题
电话面
-
盒模型
-
垂直水平居中
-
两个 div,上面的 div 下边距 50px, 下面的 div 上边距 20px,实际显示的边距是多少
-
50px,为什么? 外边距会合并
-
在不修改外边距的情况下,怎么变成 70px
-
触发 BFC
-
为什要触发BFC? 什么是BFC?怎么触发BFC?在谁身上触发?
-
在下面的 div 上新加一个父元素,在父元素上触发
-
setTimeout(() => {
console.log(1);
}, 0)
console.log(2);
// 那个先执行
// 为啥
// 印象中 setTimeout 设置为 0 会有 几ms 的延迟
// 是每次都会延迟 几ms 吗,还是其他情况
// 啊,不好意思,我不了解
-
同源策略
-
ES6 新特性有哪些,Promise 的使用
-
cookie、localStorage、sessionStorage 的区别
-
session、token
-
单点登录
-
登录的大概流程
-
100 张图片如何同时加载
-
不都要懒加载,咋还要变成同时加载,(想到了超过6个 TCP 链接会阻塞,但不知道咋解决)就说得不知道...
-
一个域名只能建立6个 TCP 链接,使用多个域名
-
使用 HTTP2,HTTP2 有多路复用...
-
-
CSRF 攻击、如何避免、原理是什么
-
实现 Math.sqrt() 方法,取整就行
-
还有其他方法吗?
-
位运算应该可以实现,但我不熟啊
-
-
判断链表是否有环
问题大多以场景来触发,我不记得场景就直接把问题写出来了,比如 100 张图片如和加载,我感觉我如果答上的话就会跟着问我 HTTP 和 HTTP2 的区别,说完一种还问我有没有其他解决方案
滴滴一面 5月17日 11:00
-
数据类型有哪几种
-
判断数据类型的方式
-
typeof 的原理
-
1 + '2',为什么,说下隐士转换的规则
-
这...咋说的清啊,我只背过引用数据类型的...
-
那你就说下引用数据类型的
-
-
ES6 有哪些新特性
-
让你手写一个Promise 你会从那几个点考虑
-
我有写过一篇手写 Promise 的文章您要不看一下
-
还是要说, then 是微任务,链式调用、then 返回 Promise 怎么处理、返回对象中有 then 方法怎么办...
-
-
Promise 的状态有几种
-
Promise.race实现思路、怎么实现
-
我:遍历,那个先个执行完就直接返回
-
面试官:怎么返回的啊
-
我:啥?
-
面试官:你写过 Promise.all,那 Promise.all 怎么返回的啊
-
我:新建一个数组,数组长度等于Promise 中传入数组的长度就返回啊
-
面试官:那是返回条件,怎么返回的(语气感觉有些急了)
-
我:resolve
-
面试官:失败那
-
我:reject
-
面试官:有些人只知道三种状态,但不知道怎么修改
-
我:不好意思,刚没获取到您想问的点
-
-
async await 知道怎么实现的吗
-
不知道,只知道是Generator函数的语法糖
-
Generator 了解多少
-
学 redux-saga 时,了解过,印象不深...
-
-
map 和 foreach 的区别,foreach 能被终止吗
-
什么是 BFC,怎么触发BFC
-
CSS 颜色有哪几种方式, rgba 中的 a 代表什么
-
跨域
-
jsonp
-
说了变量提升,a、img、script 不受同源策略限制
-
问了一下缺点
-
-
CORS
-
后端设置的请求头是什么
-
不记得啊(Access-Control-Allow-Origin)
-
-
代理
-
-
key 值得作用
-
然后说下 diff 算法整体流程,diff 算法优化
- 提到 shouldComponentUpdate、PureComponent、memo、useMemo、useCallback
-
react 16 的生命周期
-
类组件和函数是组件的区别
-
hooks 的原理
-
不知道
-
使用的限制呢?
-
-
路由懒加载怎么实现的
-
页面渲染过程
-
重排和重绘概念,怎么优化
-
css 会阻塞页面的渲染吗,js 那
- 我之前用 Bootstrap 测试的,建议自己测试一下,调一下网络,效果还是很明显的
-
dns 预解析怎么做的
-
-
不了解就知道是离的近的
-
那你是怎么知道使用的
-
观察瀑布图 TTFB 的时间时间长就考虑用 CDN
-
-
redux 工作流程
-
快排
-
你觉得快排稳定吗?
-
不稳定
-
为什么?
-
有很多种情况可将时间复杂度降到 O(n^2)
-
排序是否稳定和时间复杂度无关、和数组索引得前后位置有关
-
-
webpack 基本配置,常用 loader
-
webpack 构建过程
-
项目中对 webpack 做了哪些优化
-
http 和 http2 的区别
-
http 和 https 的区别
-
反问
- 我:不写写代码吗?
- 面试官:你想写代码吗?
- 我:我不是很想写...
图森未来一面 5月17日 14:00
-
看你简历写了解 Vue ?
- 嗯,有学过,React 更熟一些
-
css模块化了解吗,Vue 怎么实现
-
scoped
-
还有那?
-
不记得(moudule)
-
-
Vue 父子组件生命周期
父 beforeCreate -> created -> beforeMount
子 beforeCreate -> created -> beforeMount -> mounted
父 -> mounted
-
面试官:父组件的mounted 是在什么时候触发的
-
我:子组件mounted 之后
-
问了一些 js 八股文
看代码吧
// 我当时就这样注释写的顺序,让我主要解释一下 2 和 6
async function async1() {
console.log('async1 start'); // 2
await async2();
console.log('async1 end'); // 6
}
async function async2() {
console.log('async2'); // 3
// 注意:这里如果返回 Promise 的话执行顺序就不一样了
}
console.log('script start'); // 1
setTimeout(function() {
console.log('setTimeout'); //8
}, 0)
async1();
new Promise(function(resolve) {
console.log('promise1'); // 4
resolve();
}).then(function() {
console.log('promise2'); // 7
});
console.log('script end'); // 5
有这么一个数据结构:
const data = [
{
"id": "1",
"sub": [
{
"id": "2",
"sub": [
{
"id": "3",
"sub": null
},
{
"id": "4",
"sub": [
{
"id": "6",
"sub": null
}
]
},
{
"id": "5",
"sub": null
}
]
}
]
},
{
"id": "7",
"sub": [
{
"id": "8",
"sub": [
{
"id": "9",
"sub": null
}
]
}
]
},
{
"id": "10",
"sub": null
}
]
现在给定一个id,要求实现一个函数
findPath(data, id) {
}
返回给定id在 data 里的路径
示例:
id = "1" => ["1"]
id = "9" => ["7", "8", "9"]
id = "100"=> []
PS: id 全局唯一,无序
function findPath(data, id) {
function findPath2(data2, id2, arr) {
for (let i = 0; i < data2.length; i++) {
let temp = data2[i];
if (temp.sub) {
findPath2(temp.sub, id2, [...arr, temp.id]);
}
if (id2 === temp.id) {
return [...arr, temp.id];
}
}
}
return findPath2(data, id, []);
}
当时面试时大概写的代码,当时就感觉这个递归返回返回有问题,用牛客网调试还报错说栈溢出啥啥啥(后来才知道打错个字母也报这个错),看了一会也没发现会无限递归,脑子好乱就放弃了。
-
TS 中的 Pick 了解过吗
- 不了解
-
... 虚拟 Dom、Diff 算法、项目中 webpack 做过哪些优化等 ...
-
Vite 了解过吗
-
没想过写一些自动化的工具吗
- 没,精力有限...
面试结束脑回路一下就清晰了,好想给自己两刀...
function findPath(data, id) {
let res = [];
function findPath2(data2, arr) {
for (let i = 0; i < data2.length; i++) {
let temp = data2[i];
if (id == temp.id) {
res = [...arr, temp.id];
return;
}
if (temp.sub) {
findPath2(temp.sub, [...arr, temp.id]);
}
}
}
findPath2(data, []);
console.log(res);
return res;
}
技术栈不匹配,算法还答不对,太废了,第二天收到拒信
好未来学而思1对1 5月18日 10:00
自我介绍,面试官问了问比赛,听说是算法类就又聊到了快排,就让我手写快排
function quickySort(arr) {
if(arr.length <= 1) {
return arr;
}
const mid = arr[0];
const minArr = [];
const maxArr = [];
for(let i = 1; i < arr.length; i++) {
if (arr[i] < mid) {
minArr.push(arr[i]);
} else {
maxArr.push(arr[i]);
}
}
return [...quickySort(minArr), mid, ...quickySort(maxArr)];
}
写完之后又补充了数组趋近有序和数组中有大量重复元素的情况怎么优化,然后聊聊项目优化,模块化的理解,Commonjs, ES6Module 的区别...
写一个链表的插入操作
function ListNode(val = 0) {
this.val = val;
this.next = null;
}
let root = new ListNode(); // 这里当时少写个 t,报错栈溢出什么什么的,才知道无论什么错都是这个提示
let temp = root;
for(let i = 0; i < 5; i++) {
temp.next = new ListNode(i);
temp = temp.next;
}
function forEach(root) {
while(root) {
console.log(root.val);
root = root.next;
}
}
function appendChild(root, appendChild, index) {
let temp = root;
for(let i = 0; i < index; i++) {
temp = temp.next;
}
appendChild.next = temp.next;
temp.next = appendChild;
}
appendChild(root, new ListNode(9), 2);
forEach(root);
滴滴二面 5月18日 19:00
- 前端的发展
- jquery 和 React Vue 相比那个性能更好
- 我感觉数据量较小的情况下 jquery 性能更好
- Nodejs 带来的哪些东西
- 构建工具
- 项目优化
- 做开源项目会考虑哪些事情,项目结构怎么搭建,组件怎么封装啊
- 打包的资源文件比较大怎么办
- split-chunks 做代码分割,我有用 umi 的 dynamicImport 实现过按需加载,说了Network优化前后的加载时间对比
20分钟
好未来学而思1对1 二面 5月21日
-
自我介绍
-
先写到题吧括号匹配
-
你觉得原生 js 和 React 哪些不一样
-
然后聊聊项目优化
-
为啥学前端
5月26日下午收到了好未来hr的电话,没接到回拨,以为给我约 hr 面试,结果是给我约别部门面试,因为我投递了好几个部门,知道我已经二面了,然后帮我查了一下说二面通过,让我等 offer...
等了好久没信,通过内推人问了校招负责人说招的比较满了...
CVTE HR面 5月26日
-
最近在干嘛
-
为什么学前端
-
对工作状态有什么期望
-
平时在学校的最晚下课时间
-
对城市有没有要求
-
家里对你有什么期望
-
未来三到五年规划
-
压力最大的事
-
说一下你觉得最有意义的项目
-
之前技术面试 10分 给自己打几分
-
扣在那里
-
感觉自己基础怎么样
-
有什么兴趣爱好
-
喜欢看什么类型的电影
-
喜欢那个明星
-
为什么喜欢...
-
-
打不打算升本
-
不打算
-
为啥
-
-
大学最遗憾的事
-
手里有那个公司 offer
-
那不挺好的,为什么还在找
然后晚上再一看就挂了...
ThoughtWorks
这家公司是一个外企很有意思,流程相同,但面试风格完全不同于国内公司
一面 5月22日
-
一面的邮件会给一个 github 的链接,里面有一些写好的代码,面试刚开始介绍一下流程和仓库代码,先提几个需求,然后你去熟悉代码,想着怎么去做这个需求,面试官回和你一起分析讨论这几个需求,一点一点去引导你,看你怎么分析怎么解决问题和思考的过程,先写测试用例(有示例代码,不会的他会教你),在写功能。写完代码,他会给你一些建议(比如下代码)。
// 指导前 let price = 100; function disCount(rate) { if(rate == '二折') { return price * 0.8; } return price }
// 指导后 let price = 100; function getDisCount(rate) { let disCount = 1; if(rate == '二折') { disCount = 0.8; } return price * disCount; }
// 拓展了一下 let price = 100; function getDisCount(rate) { let disCount = 1; let obj = { '二折': 0.8; } if(obj[rate]) { disCount = obj[rate]; } return price * disCount; }
二面 5月31日
-
二面邮件里给了这么一个 pdf,面试先演讲,然后探讨,聊观点
-
问我对 ThoughtWorks 了解,讲了下氛围和工作职责说 ThoughtWorks 更倾向于每个人多发向发展,各个领域都会去学习,所以对要求每个有很强学习能力和接触新事物的能力,不专注某一领域,但是这就导致让某一人很难成为一个领域的专家,看说看我的简历第一反应时感觉不太合适的因为我的简历是偏专注前端的,问我是想在前端领域深耕吗?
- 我比较想一精多通
两场面试都是在讨论中进行一个小时左右,面试体验很好、收获很多
百度 6 月 7 日
-
你在那是实习过吗
- 没有啊
- 没实习过
- 真没有 先写题,写了大概 25 分钟,大多是一些代码让看执行结果(和我说不要外泄,知识点就是闭包,原型链,this 指向、异步),后面两道编程题,然后解释一下为什么是这个结果,聊聊项目,
-
你报过培训班吗
- 没啊(之前想报来着,太贵了,报不起),不过培训机构的视频我之前看过不少,现在看文档看书多一些
- 都买了什么书...
-
有哪个公司的 offer
- 我能先问贵公司的招聘流程吗
-
反问
- 你不想了解一些团队工作和氛围什么的吗
- 哦,这个,我一般二面问,万一一面完了没了那(我嘴是开过光的吗)
66分钟
牛客网看的帖子投的邮箱,回复说部门实习生已经招满了,把我推给其他部门 leader,晚上 hr 约的面试。我简历也没藏学历啊,我还单独列个教育经历,虽然面试官确实挺好的,做错的问题会引导着我,收获也挺多的,但是正式变外包我还是接受不了,想做外包当初阿里云外包就去了,何必等到现在。
债是自己欠下的怨不得别人