每一个程序员都拥有一座大厂梦,我也不例外,之前面试字节跳动,竟然被算法问倒了,很多算法都没解出来,解出来的也还不是最优解,才二面就凉凉了。回去之后也潜心复习了,准备了二战,如今终于进入了字节跳动,被录用,定级2-2。
一、首站字节被挂
对于这个独角兽企业,LZ当时报了很大的期望,但是没有确切的了解面试情况(对自己蜜汁自信),没有了解到字节对算法这么看重,稍稍懈怠了下,没想到直接挂了,字节面试流程还是很快的,意识到不对的时候已经晚了……
- 给定一个整型数组,查找三个元素相加等于0的所有三元组,要求去重
- 给定一个数组,调整该数组,使其满足堆的性质(初始化建堆)
- 判断一个链表是否为回文链表,说出你的思路并手写代码
- 你知道哪些排序算法,这些算法的时间复杂度分别是多少,解释一下快排? .....
想起来的就这些了,当时被问得一脸懵逼,半小时憋不出几行代码来,浪费了一次宝贵的面试机会。
我个人其实也不是特别喜欢做题,好玩的事情太多了,但是没办法,现状就是这样,Android程序员这几年太多了,竞争越来越激烈,就各种手段卡你呗,说不内卷那也是不可能的。我之前也是温水煮青蛙,出去面试了才被教各种做人!
你没有好的公司项目背景,只有做题。(除非学校,学历,项目经验,开源项目,公司背景等有不错的优势)
二、二战字节
字节一面:
- Activity生命周期,每个回调方法的作用是什么
- 事件的分发机制
- 内存泄漏
- 遇到过滑动冲突吗?滑动冲突的解决方法
- Hashmap原理
- Hashmap扩容机制
- 手撕双重校验锁,volatile的作用
- synchronized和volatile的区别
- 线程池的参数
- 异常机制
- synchronized修饰static 方法和修饰普通方法有什么区别
- 双亲委派模型,为什么要这样
- sharedPreferences的原理,多进程下是否可以使用,apply和commit 有什么区别
- 算法题:每k个反转链表;一个长度为N的整形数组,数组中每个元素的取值范围是[0,n-1],判断该数组否有重复的数,请说一下你的思路并手写代码......
字节二面
- 四大基本组件和作用
- Activity生命周期,启动模式,taskAffinity,横竖屏转换,onNewIntent
- Service两种启动模式,有什么区别。
- 广播,广播分类。普通广播、异步广播、有序广播
- view的绘制流程
- Framelayout wrap_content TextView match_parent 怎么显示
- 约束布局和RelativeLayout的区别
- 布局优化
- include、viewStub、merge 的使用和区别
- mvp、 mvc、mvvm
- 如何创建一个viewModel
- Handler
- ThreadLocal
- 算法题:二叉树查找,将这条路上的结点存储;之字形打印二叉树,使用辅助栈实现,实现完后问我:不使用辅助空间怎么做。回答递归,并且递归时记录当前层数
字节三面
1.适配器和装饰模式各自特点和使用场景 2.视频编解码是怎么做的 3.三色球排序 ......
四面(HR)
到这一步就是正常走流程了,就不叙述了……
三、二战字节前,我是如何复习的?
LZ其他技术掌握的还算牢靠,主要是算法方面有些欠缺,复习时主攻的算法。
从朋友那薅到一份**《2021最新版数据结构与算法⾯试题⼿册》**,硬着头皮全部啃完了,不直接看答案,先自己思考,不然很容易忘记,实在不会的看题解,看看别人的解题方法。做完了之后总结思路和常见套路。
1.哈希
- 请说⼀说,Java中的HashMap的⼯作原理是什么?
- 介绍⼀下,什么是Hashmap?
- 讲⼀讲,如何构造⼀致性哈希算法。
- 请谈⼀谈,hashCode() 和equals() ⽅法的重要性体现在什么地⽅?
2.⼆叉树
- 求⼆叉树的最⼤深度
- 求⼆叉树的最⼩深度
- 求⼆叉树中节点的个数
- 求⼆叉树中叶⼦节点的个数
- 求⼆叉树中第k层节点的个数
- 判断⼆叉树是否是平衡⼆叉树
- 判断⼆叉树是否是完全⼆叉树
- 两个⼆叉树是否完全相同
- 翻转⼆叉树or镜像⼆叉树
- 两个⼆叉树是否互为镜像
- 求两个⼆叉树的最低公共祖先节点
3.链表
- 谈⼀谈,bucket如果⽤链表存储,它的缺点是什么?
- 有⼀个链表,奇数位升序偶数位降序,如何将链表变成升序?
- 如何反转单链表
- 现在有⼀个单向链表,谈⼀谈,如何判断链表中是否出现了环
- 随机链表的复制
4.数组
- 写⼀个算法,可以将⼀个⼆维数组顺时针旋转90度。
- ⼀个数组,除⼀个元素外其它都是两两相等,求那个元素?
- 找出数组中和为S的⼀对组合,找出⼀组就⾏
- 求⼀个数组中连续⼦向量的最⼤和
- 寻找⼀数组中前K个最⼤的数
5.排序
- ⽤Java写⼀个冒泡排序?
- 介绍⼀下,排序都有哪⼏种⽅法?请列举出来
- 介绍⼀下,归并排序的原理是什么?
- 介绍⼀下,堆排序的原理是什么?
- 谈⼀谈,如何得到⼀个数据流中的中位数
- 你知道哪些排序算法,这些算法的时间复杂度分别是多少,解释⼀下快排?
6.堆与栈
- 请你解释⼀下,内存中的栈(stack)、堆(heap) 和静态区(static area) 的⽤法。
- 说⼀说,heap和stack有什么区别。
- 最⼩的k个数
- 滑动窗⼝最⼤值
- 丑数前
- 前K个⾼频元素
- 有效的括号
- 最⼩栈
- 柱状图中最⼤的矩形
7.⾼级算法
- 请你讲讲LRU算法的实现原理?
- 为什么要设计 后缀表达式,有什么好处?
- 请你设计⼀个算法,⽤来压缩⼀段URL?
- 谈⼀谈,id全局唯⼀且⾃增,如何实现?
- 最后⼀个单词的⻓度
8.动态规划
- 斐波那契数
- 不同路径
- 爬楼梯
- 零钱兑换
- 打家劫舍
- 编辑距离
由于篇幅限制,展示了部分内容截图,需要这些文档资料的,可以点赞支持一下我,然后【点击这里】免费阅读下载。
希望所有的程序员都能够学习起来,努力实现我们的大厂梦!