JasonGao Thoughts

你可能需要这份大厂面经

2020-08-29

今年小红书这边发完年终奖之后,心里隐隐觉得要出去看看机会,因为在小红书这边已经呆了快三年了,对于一些技术,业务总觉得有点麻木了,内心里总觉得自己啥都会了,但是很多只是知道个皮毛。

有句话是这么说的,一个人在一个地方待久了,内心里以为他所处的这个环境就是全世界,所以想着做些改变,不管结果如何,至少让自己走出舒适区,同时也想着能去大厂看看。

其实大家也不能特别迷信大厂,认为加入大厂就没有后顾之忧了,只能说目前对我现在这个阶段来说,加入大厂刷一下自己的大厂背景这个对于自己当下来说还是有益的。

一开始也是不确定到底要不要出去看机会,一个是因为疫情,另一个是内心里总觉得没有准备好,其实很多事情在你开始行动的时候就没有那么多顾虑了,就像很多人在学生时代考试时一样,永远都会觉得自己没有复习好,但勇敢地迈出第一步,后面基本就没啥可恐惧的了。

自己这段时间主要就面试了三家公司吧,字节,腾讯和阿里,但经历的面试场次感觉有十来场了,有的对应的是同一公司的不同业务吧,字节面的两个业务部门都失败了,腾讯那边QQ音乐团队给了Offer,阿里这边也给了Offer,说实话,面试还是蛮累的,于是后面其他的公司也没有再尝试了。

字节

最开始面试的是字节在上海这边的在线教育部门,这算是自己今年的第一次面试吧。

由于当时是处于一个基本没有啥准备的状态下面试的,最早是由于之前同事海哥帮忙内推的,我一开始的时候也是有点没想好是不是要面试,但因为海哥说了几次,索性我就面面看看吧,因为自己这个时间点基本是没有怎么准备,所以面试答的不怎么好,另外就是字节对于算法比较看重,我当时算法题没些出来,所以这一面基本就没有后续了。

这次主要问了以下几个问题,都是我面试完通过记忆记录下来的。

首先是自我介绍吧,介绍之前的一些经历和项目

  • 做过哪些app的性能优化
  • 使用什么工具进行内存分析
  • 讲讲事件拦截机制
  • 对于网络的理解,http和https的区别
  • 讲讲对于UI的理解
  • 安全,怎么保证安全,除了网络层的安全,app其他地方如何保证安全
  • App为什么要签名
  • 算法题,最大区间问题 已知一天内用户登录登出的日志(数据量较大),求这一天用户在线的最大峰值和持续时间段 日志包含字段(userid, login_time, logout_time) 登录登出时间精确到秒
    从这次我也还是懒懒散散地在准备中,可能面试失败对我并没有产生多太多触动。

这次面试没有后续之后,后来字节这边有个安全的团队也说是要和我聊聊,这次面试的时间是在周六,当时一共进行了两场面试,为什么是安全团队呢,因为他们看我的简历发现我是信息安全毕业的,但是说句实话,学校里学的那些关于信息安全相关的知识离工程实践还是有点远的,所以这次面试我基本上都是全程懵逼状态。

下面列举的是这次面试的一些问题:

  • bindService的流程
  • 应用双开的机制
  • 第三方的权限拦截
  • 自我hook
  • gps的定位模拟
  • imei号的伪造
  • socket通信 JNI 输入
  • WebView的读文件flag在4.4是否开启
  • Android中的网络通信方式有哪些
  • IPC的方式
  • 广播实现IPC方式的话有什么安全隐患,需要注意什么

字节这边后面还面过抖音的上海部门,这会已经是后面了,因为这时基本已经拿到腾讯的Offer了,阿里这边也还在面试流程中,所以就想着面面看看情况,这次是一个之前的同事的同事帮忙内推的,这里同样列举下问的问题:

  • 问了我简历中做的那个吸顶效果,怎么实现的
  • 对象的创建的流程
  • 事件分发的流程
  • OOM发生在哪些区域
  • 方法区加载的类是否会被GC
  • startActivity的流程
  • 开机启动的流程
  • RN的工作原理
  • fluter了解嘛
  • RN有些时候为什么有留白
  • 包体积优化
  • Android的系统架构
  • 小红书首页过渡严重,过度绘制的解决
  • 优化做过哪些,数据是怎么样的
  • 小红书笔详的引导是怎么做的
  • Android为什么有多进程,单进程都没有多进程通信的问题了,不挺好的嘛
  • 双指按下去一个View不抬起将View滑出屏幕这个流程是怎么样的
  • yogo是干什么的
  • litho的原理是什么
  • 指定start和end位置的链表的翻转

相对来说,我觉得抖音的这次面试有些问题问的还是比较有难度的,加上我后面给了个算法题也还是没能写出来。所以基本上后续也没有消息了,唉,感觉自己还是太菜了。字节每一轮面试都会问一个算法,对于算法的考察应该算是大厂里面比较严格的。

腾讯

后面有个猎头说是微信那边要招人,说是机会不错,于是我决定试试。当时想着就当增加增加面试经历吧。

后面猎头推荐后,广州那边有个人打电话过来说是要进行电话面试。我当时其实关于算法这一块还是没怎么复习,于是这次微信的面试直接上来就是笔试,我记得是5道算法题,还有一个关于多线程的编程问题,要求45分钟内完成。

大概的题目如下:

题目1(算法):给出n(n>=1),请把1,2,…,n,最小分成m组,使得每组内的数字都互质,求m值。例如n=7,可最小划分成3组,{1, 2, 3}, {4, 5}, {6, 7}

1
2
3
int findmin(int n) {
// TODO
}

题目2(算法):给定一个递增循环整数数组,从里面找出最小的元素,使用的算法越快越好。特别地,最小的元素可能出现在数组中间。比如:50, 52, 63, 90, 3, 8, 15, 44。

1
2
3
4
5
class Problem2 {
int findmin(int[] arr) {
//TODO
}
}

题目3(算法):在二叉排序树上面找出第3大的节点。注意:不能把二叉树全量存储到另外的存储空间,比如存储到数组中,然后取出数组的第三个元素。

1
2
3
4
5
6
7
8
9
10
class TreeNode {
int value;
TreeNode left, right;
};

class Problem3 {
TreeNode find(TreeNode root) {
// TODO 请完成实现部分
}
}

题目4(语法):用Java语言实现System#arraycopy数组拷贝,注意:不能直接使用System.arraycopy

1
2
3
4
5
class Problem4 {
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) {
// TODO 请完成实现部分
}
}

题目5(多线程):阅读下面代码,在2线程环境下,设计一个方案,判断无限数据流(Stream)每个正整数是否素数,越快越好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
interface Stream {
long get(); // 获取下一个需判断的整数
void put(boolean result); // 返回整数是否素数的结果
static boolean isPrimeNumber(long num) { // 判断一个整数是否素数
if (num < 2) return false;
for (long i = 2, s = (long) Math.sqrt(num); i <= s; i++) {
if (num % i == 0) return false;
}
return true;
}
static Stream getInstance() {
try {
return (Stream) Class.forName("StreamImpl").newInstance(); // 运行环境保证不会异常
} catch (Exception e) {
return null;
}
}
}
//比如:Stream={1,2,3,4,...}, Result={false,true,true,false,...},注意输出顺序。
public class Problem {
private Stream stream = Stream.getInstance();
public static void main(String[] args) {
Problem instance = new Problem();
new Thread(() -> {
while (true) {
try {
instance.thread1();
} catch (InterruptedException e) {

}
}
}, "thread1").start();
new Thread(() -> {
while (true) {
try {
instance.thread2();
} catch (InterruptedException e) {

}
}
}, "thread2").start();
}
public void thread1() throws InterruptedException {
// TODO 请完成实现部分
}
public void thread2() throws InterruptedException {
// TODO 请完成实现部分
}
}

因为之前没准备,我当时连二叉搜索树是有序的这个概念都忘了,把二叉搜索树当做普通的二叉树去处理了,感觉当时在45分钟过后,面试官操着一口广东味的普通话来我和沟通的时候,让我当时有种直接挂断电话的冲动,总之,就感觉这次面试体验很不好,让我有种想去撞墙的冲动。

也是从这个时候开始,开始意识到要好好准备算法,不然真的是没有继续面下去的必要。

微信这边的面试基本没有后续了,答得这么差,有后续才怪咧。

后面我的简历应该是被收到腾讯的人才库里去了,于是有深圳那边的业务开始打电话给我说是要面试。

一开始是深圳的一个做SDK的部门,和我进行了一次腾讯会议的视频面试。这次基本就是聊技术,这个面试官对我的评价不错,主要聊了聊我在小红书做的一些东西和自己平时做的一些技术沉淀,然后问了一些Android相关的技术问题,觉得我的表现不错,但是因为他们是做SDK的,和我这边的经历不是特别匹配,面试官当时也直接说了可能不是特别匹配,但是他说会在面试反馈中给予我比较好的面试评价。

可能也是因为这个原因,后面我的简历又被腾讯的其他业务部门捞起来了。

首先是手机QQ团队,一面面试官问的都是一些Java和Android 基础问题,但是问的比较多,基本上各个知识点都问到了一些。

一面基本上问了下面一些问题:

  • 做过哪些内存优化

  • 内存抖动,如何定位内存抖动

  • view移动用动画实现有哪些方式

  • 自己实现区域解码,decodeFileDescriptor

  • scrollto 和 scrollby 的区别

  • 内存泄漏如何分析

  • mvc,mvp和mvvm的区别

  • mvvm的缺点是什么,mvvm为啥不用DataBinding,不用DataBinding怎么实现双向绑定

  • leakcanary 的原理

  • 事件冲突如何自己解决

  • RecyclerView和ListView的区别

  • Service和IntentService的区别

  • Service如何stop,bindService的方式如何stop

  • aidl 的原理

  • 多进程通信方式

  • 自己实现过多进程吗

  • HashMap的原理是什么

  • 红黑树的原理是什么

  • Handler可以在多个线程里使用嘛,有几个消息队列,每个线程的消息是如何发到另一个线程的

  • aidl 自己写如何实现

  • 用过哪些设计模式,设计模式

  • 工厂和抽象工厂的区别(因为上面我说在项目中实践过工厂设计模式,所以他就问了工厂和抽象工厂的区别)
    手Q二面是视频面试,问的问题是比较抽象一点,感觉一般没有固定的答案。

  • 如果不采用改变Bitmap config的这种方式,如何做Bitmap的内存优化

  • 网络优化怎么做

  • 单元测试

  • 硬件加速的原理,硬件加速是如何工作的

  • RecyclerView 滑动到item不可见后,这部分内存时是如何回收的

  • 卡顿检测怎么做,如何上报

  • 写个死锁的代码

  • 假如字符串中所有字符都不重复,如何输出字符串的所有组合。例如:abc,结果应是a,b,c,ab,ac,bc,abc。

二面答的问题基本没怎么答好,有的是自己不怎么涉及这些,有些则是对于某些理解不够深入。其实我觉得这次面试失败是因为这个几个问题没回答好,我能感觉到面试官有种不想继续聊下去的冲动了,后面则是象征性地出了一道算法题。

接着收到了QQ音乐的面试邀请,这次面了好几轮,一开始是那边的HR给我打了个电话,基本就是聊为啥换工作,能不能去深圳这样,以及在小红书的工作内容等等。

接着面了好几轮,两轮技术面,一轮交叉面,还有总经理面试,最后还有HR面,因为面的轮次比较多,当时对于面试题也没有特殊整理,不过大概问的问题都是这些东西,和之前的面试问题大差不差。

面到后来QQ音乐这边算是通过了,给的Offer还可以。

腾讯这边还面过腾讯视频的岗位,这个是在自己懒散的情况下进行的,因为基本确定要去哪了,当时就想着涨涨面试经验啥的。这次面试基本面试完之后我就觉得没有后续了。下面是问的一些问题:

算法题:输入[“eat”,”ate”,””tea”,”and”,”den”] 要求输出“换位词”,[[“eat”,”ate”,””tea”],[”and”],[”den”]]

  • 业务上做的有挑战性的东西是啥
  • RxJava底层进行数据通信的原理
  • RxJava和EventBus做通信的区别
  • 线程的状态
  • 线程的两种创建状态
  • 线程池的种类,以及内部是如何管理线程的,什么时候创建,什么时候让线程运行

阿里

阿里这边就让同事认识的一个阿里员工内推了阿里的岗位,这次面的是淘宝下面的一个业务。当时是在差不多拿到QQ音乐Offer的时候开始的,当时也没有想太多,反正就是想试试,因为当时想的是,拿不到这边的机会,就去深圳工作去。

阿里的面试一面问的基本都是业务相关的,基本就是讲自己在小红书做的东西和一些Android基础知识。这几次面试我也没有做什么面试题的记录。

二面上来也是问技术啥的,后来搞了三个笔试题,一个是排序问题,一个是用栈来模拟队列,还有一个是写一个小的商品feed流的demo,难度不是特别大,关于问的一些具体的面试题我也忘了,差不多都是那些东西吧。

最后一面是HR和Leader一起的终面,Leader应该是这个业务线的领导,没有问具体的技术问题,问的都是一些比较开放的问题,阿里的这次面试整体感觉还算顺利吧,后面就是算是通过了,给了Offer。

基本上,自己面试比较顺利的几次都没有记录下来。关于Offer的选择,腾讯相对阿里,杭州相对深圳,压力要小很多,所以决定去阿里,所以就拒了QQ音乐这边的机会,但是心里还是蛮喜欢这个工作岗位的。

总结

整体说来,这段时间的面试不能算是成功的,很多面试都没有通过,通过的还有运气成分在里面吧,这也提醒我自己要学习的东西还有好多吧,尤其自己在算法这一块还是比较薄弱的,对大多数人来说,算法题这块没有啥捷径吧,就是多刷题吧。

我记录这些希望能对面试的人有些帮助吧,因为之前很多人让我写面经啥的,我也不太清楚怎么写,就是把一些问题记录下来吧,如果你觉得有帮助,可以帮忙点赞分享下,感谢。

公众号同步更新,欢迎关注😄