腾讯一面, 是在所有大厂之中是我不太满意的一次面试
一方面的确是自己发挥有点问题, 一方面我觉得面试官的态度和面试技巧有点问题
由于字节一面完背靠背面试腾讯, 我建议面试安排最好不要这样, 很累的。因为字节面试完就感觉被榨干了一样, 第二天感觉很累很乏。原因可能是
- 年纪大了体力不好
- 面试大厂的确要准备很多
- 大厂面试很消耗体力
- 面试完要进行复盘
所以我以过来人经验不太建议背靠背面试2家大厂。
问题1.介绍下自己
问题2.介绍下自己做个的项目
腾讯相比其他大厂不同, 开始就是一道算法题
问题3.算法题: 找出最接近的数
给定一个自增Int数组arr 以及 一个数k, 找到最接近数k的数字(数组中不包含k), 相同返回一个就行
例如:
arr = [1, 2, 5, 6], k = 4 返回 5
arr = [2, 3, 4, 5], k = 1 返回 2
arr = [2, 3, 5, 6], k = 4 返回 3, 5都可以
题目不难, 第一反应遍历法
, 循环判断数组arr中每一个值与k的绝对值, 找到最小绝对值直接返回。然后我觉得这种方法不太优雅, 要装个b, 用二分法
写这道题。
问题就在这个时候发生了, 当算法写完我这边需要传入参数验证一下算法是否正确。 结果腾讯算法面板跟其他面板运行不一样, 提示信息相比其他算法面板有点模糊无法定位具体问题在哪... 立即请求面试官, 结果面试官说他也不太清楚, 然后跟我一起研究面板问题
第一反感
贵公司自己开发的产品, 怎么能现场熟悉 ?
最后原因找到swift调用方法要写在函数后面, 测试了一下提示 time out, 因为之前研究面板浪费了一些时间, 这个时候比较紧张。接下来发生了不愉快的事情。面试官开始一遍遍催, 快点做, 没剩多少时间了!
第二反感
通常算法面试(包括我面试别人), 给定一个时间, 中间不做任何发言, 问问题除外。时间到了结束算法题。最多可能5分钟结束前提示下面试者。
而且这种行为类似: 项目中写了一个bug, 一个人在站在你后面, 一直指点, 一直念怎么还没解决, 怎么还没解决之类的。在紧张或者高压下给与干扰, 其实是程序员忌讳的一种行为。
自我反思
但其实后来想一想的确是自身问题, 如果真的强一遍验证就能过, 没有后续问题。或者不装直接用遍历法先保证运行成功, 时间空余再写二分。
参考代码
方法.1 遍历法
func cal(_ arr:[Int], _ k:Int) -> Int {
// 判断如果数在边界外直接返回对应边界值
if arr.first! > k {
return arr.first!
}
if arr.last! < k {
return arr.last!
}
// 默认最小值,
var min_abs = abs(arr.first! - k), res = arr.first!
// 遍历数组
for i in arr {
// 如果当前绝对值大于最小值, 说明, 上一步查找的即为最近的的数
if abs(i - k) > min_abs {
// 返回 res
return res
}
// 令res 等于 I, 最小值min_abs, 为i与k的绝对值
res = i
min_abs = abs(i - k)
}
// 返回结果
return res
}
方法.2 双指针
func cal(_ arr:[Int], _ k:Int) -> Int {
// 判断如果数在边界外直接返回对应边界值
if arr.first! > k {
return arr.first!
}
if arr.last! < k {
return arr.last!
}
// 定义双指针
var last = 0, next = 1
// 遍历
while next < arr.count {
// 如果滑到, k处于两个数之间, 直接判断哪个近直接返回
if arr[next] > k && arr[last] < k {
return abs(arr[last] - k) > abs(arr[next] - k) ? arr[next] : arr[last]
}
// 滑动, 指针递增
last += 1
next += 1
}
return arr.last!
}
方法.3 二分法
func cal(_ arr:[Int], _ k:Int) -> Int {
// 判断如果数在边界外直接返回对应边界值
if arr.first! > k {
return arr.first!
}
if arr.last! < k {
return arr.last!
}
// 定义last 初始下标 0, next为末尾下标 arr.count - 1
var last = 0, next = arr.count - 1
// 循环
while next > last {
// 二份
let m = (next - last) / 2
// 如果m = 0 即k在arr[last], arr[next]之间
if m == 0 {
// 直接判断哪个近直接返回
return abs(arr[last] - k) > abs(arr[next] - k) ? arr[next] : arr[last]
}
// 如果二分数 > k, 说明 k 在last ~ m, 令 next = last + m
// 如果二分数 < k, 说明 k 在m ~ next, 令 last = last + m
if arr[m] > k {
next = last + m
}else if arr[m] < k {
last = last + m
}
}
return 0
}
最后算法写完了, 但是没有正确运行成功。跟面试官解释了我的2种思路, 然后开始口述题。
问题4.Runtime介绍
runtime是一套C, C++, 汇编构成的Api。其实我们平常接触的alloc
, objc_msgsend
, runloop
等都是runtime。因为runtime概念很大很多, 我只举例结合objc4 runtime源码给面试官管讲解了objc_msgsend
流程
底层原理可参考我之前写的:
IOS底层(十三): 消息流程(一)快速查找
IOS底层(十四): 消息流程(二)慢速查找
IOS底层(十五): 消息流程(三)动态方法决议和消息转发
问题5 App卡顿都有哪些情况导致
因为这个问题很开放, 我也只是从CPU, GPU两个方面来分析
-
CPU
(中央处理器, Central Processing Unit): 通常用于执行程序指令, 对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版 -
GPU
(图形处理器, Graphics Processing Unit): 通常用于针对图像信息的渲染。
页面卡顿原因
正常情况下,CPU会周期性的提交要渲染的图像信息给GPU处理,保证视图的更新。一旦其中之一响应不过来,就会表现为掉帧卡顿。
掉帧
: CPU
处理数据和GPU
渲染时间过长导致
解决方法
尽量减少CPU, GPU消耗
CPU方面
- 尽量用轻量级的对象, 例如: 不用事件传递地方考虑使用CALayer取代UIView
- 尽量提前计算好布局,最好不要频繁修改属性, 例如频繁地调用UIView的相关属性frame、bounds、transform等属性,减少不必要的修改
- 图片的size最好跟UIImageView的size保持一致
- Autolayout会比直接设置frame消耗更多的CPU资源
- 主线程不要阻塞
- 控制一下线程的最大并发数量, 耗时操作放在子线程执行, 例如: 文本处理, 图片处理等
- UI控件规范使用, 例如NSTimer等
GPU方面
- 尽量避免离屏渲染
- 尽量避免短时间内大量图片的显示
- 尽量减少视图数量和层次
- 尽量避免超大图片, GPU能处理的最大纹理尺寸是4096x4096,超过这个尺寸,就会占用CPU资源进行处理
- UI控件规范使用, 例如tableView等
最好也提下, 使用内置的性能工具instruments
在开发中来检测性能, 耗时等问题
问题5.1 追问Tableview卡顿哪些情况导致
可以从这几个方法来作答
- 重用导致, 频繁调用
cellForRowAtIndexPath
方法, 并在里面进行布局, 赋值等 - 频繁cell计算高度heightForRowAtIndexPath:
- 滑动同步加载大量图片, 或者滑动没有按需加载
- 大量用addView给cell动态添加视图
- 不要使用clearcolor,无背景色,透明度不设置为0
- 正确储存Tableview数据, 减少全部刷新
问题6.App启动优化
也是个开放性问题, 但App启动整个流程涉及知识点就很多, 启动优化我建议从几个点举例子谈
- dyld方面: 排查无用的dylib(动态链接器), 减少dylib数目
- 库方面: 梳理库, 非必要库做延迟加载
- 加载方面: load方面少做事情, 不做最好
- 类方面: 减少启动无用的类添加, 包括不常用库, 方法, 分类, 全局变量等
- 图片方面: 压缩资源图片,删除无用的图片
- 算法方法: 针对启动必要算法方面, 做对应优化, 减少/避免多余计算
- 打印方法: 减少NSLog打印
最好还是提下, 使用instruments
分析哪些比较耗时, 针对性优化下
可能面试1小时, 时间已经快到了, 口述题只面试3~4个问题就告诉我今天面试结束了。
第三反感
面试3~4道开发题就结束面试, 说实话我真第一次遇见, 更不敢相信这是一个大厂面试。
自我反思
的确是面试时间快到了, 因为面试1个小时, 下一个时间段没准是给下一位面试者准备的。还是少一些抱怨, 多提升自己。
总结下
面试题目都不难, 可惜算法浪费了很多时间, 如果稳扎稳打的话, 腾讯一面是可以过的。面试反馈很快, 1天就能收到结果, 我这边结果自然是不通过。但是腾讯一面整体给我感觉不太难, 有实力的小伙伴可以试一试。
PS:
同时无论是面试官还是面试者都应该了解
-
面试官: 说话做事代表的是公司形象, 尊重为首要原则
-
面试者: 态度要摆正, 礼貌是第一位, 接着才是技术
通过这次经验, 也给与我在未来面试以及面试别人一些警示。
网友评论