Android暑期实习面经记录
阿里一面,15min
估计阿里一开始也是没打算要我的, = =面试管聊了不久,也没问什么问题,都是闲聊。
- 项目
- 单向链表(插入,删除快)
- 双向链表(这个就厉害了,比如LinkedList,比如LinkedHashMap,使用双链表刚好可以实现队列的功能,并且是双队列Dequeue)
- 各自的应用
- 归并排序
腾讯一面,57min
- 项目
- ViewPager优化(其实就是View的复用,可参考ListView的优化思想,将View放到集合中去,初始化时找不到才加载,销毁前将View保存)
- RecyclerView与ListView,还有RecyclerView的下拉加载和上拉更新怎么实现,比如下拉的橡皮筋效果
- 自定义View的实现,事件分发机制
- View的嵌套滑动冲突(比如水平和竖直可通过水平和垂直方向距离判断)
- TCP/IP协议族。讲一讲每一层的实现,传输层的可靠性,滑动窗口和流量控制、拥塞控制
- Java内存模型
- Java垃圾回收机制
- 线程池以及多线程,线程池的阻塞队列
- Android消息机制
- OOM发生的情景和原因以及解决办法
- Bitmap的优化
- 归并排序和快速排序
- Java对象引用的类型,强引用,软引用,弱引用,虚引用
算法题
- 数组循环右移n位,利用最少辅助变量解决
- 一个正序的数组,一个逆序的数组,如何将它们排序
- 100层楼问题,2个玻璃球,从某一层楼掉下去会碎,某一层楼以上不会,那么试验时找出楼层所用实验次数的最坏次数最少?
第一个问题
1.可以利用空间换取时间,新建一个数组,将后m位放到新数组前m位,前面的放到新数组后面,新数组再赋值到原来数组。时间复杂度O(n),空间复杂度O(n)。
2.从最后一位开始,一次移动一位,m为就循环m次。时间复杂度O(n^2),空间复杂度O(1)。
3.将原数组反序,再将前m位反序,再将后面的反序,即完成。时间复杂度为O(n),空间复杂度为0,为最优解。
第二个问题
这个一个动态规划题。动态规划与分治法有什么区别?个人理解分治法将问题分成若干子问题,每个子问题接下来又分成若干子问题,然后从最小子问题开始将所有问题逐个求解,便得到最终解,所有子问题互相独立,通常采用递归实现,典型如数组的归并排序。
dp(动态规划)则是将问题分解成若干子问题,每个子问题也可继续分为若干子问题,然而子问题之间不是互相独立的,而是存在重复解,并且最小子问题是有状态的,这个状态必须能够进行传递。典型如斐波契斯数列,Fn = F(n-1)+F(n-2),F(1)=F(2)=1。其中F(1)和F(2)为最小子问题,并且他们的状态(值)必须传递给F(3),也就是递归式其实是状态传递方程,其中比如F(5)=F(3)+F(4),F(3)=F(2)+F(1),F(4)=F(3)+F(2),其中就存在重复求解了,所以dp就是为了消除这种重复求解,解决办法就是把每个过程的计算结果(帅选结果或加减结果)保存到数组dp里面,这样子每次就只是取已经保存的结果,不必重复计算了,其实就是空间换时间。典型式子为 dp[i] = dp[i-1] + dp[i-2]。
回到上题,假设第k层摔玻璃球,要么碎要么不碎,如果碎了就只有一个球,只能从一楼试,若没碎,则有两个球,当然不是从k+1试啦,可以等效一开始,进行递归。状态方程为 dp[i] = Min(Max(1,dp[i-1]+1),Max(2,dp[i-2]+1),..Max(i-1,dp[1]+1)),dp[1] = 1。需要两层循环,时间为O(n^2),空间为O(n)。
回溯法的要点:
1.构造问题的解空间树,得到问题所有解
2.根据解空间树的特点回溯搜索整棵树
3.输出每一次符合要求的解x[],也就是成功遍历到了树的最后一层
递归伪代码
//从第0层开始搜索
backTrace(int deep){
//搜索层次大于树的层次,说明已经成功得到一个解
if(deep>=totalDeep){
printf(x)//输出解
return ;
}
//遍历子树
for(i = 0 to 1){
x[i] = 0/1 // x[i]该赋的值
if(赋值x[i]后该结点是活结点 && 界限函数){
backTrace(deep++) //搜索第deep+1层的解
}
}
}
威锋网一面(多人面) 20min
一个HR,一个技术人员好像,两个人一共只面了20min左右,全是关于安卓。
- 项目
- RecyclerView、ListView(囧,这俩货必问,却不是很熟悉,该补补了)他们的异同(缓存原理、ViewHodler、缓存View、LayoutManager、ItemDecoration、ItemAnimator、点击OnItemClickListener、OnItemTouchListener、数据源更新等)
- 说说都有哪些设计模式?大概讲了6-7种就问他还要不讲,他说不用了= =
- BaseAdapter的原理
- 自定义动画实现
- 进程间的通信
最近笔试部分题目
布局优化怎么优化
- include标签复用
- merge标签合并
- viewstub
- 使用relativeyout,constrainslayout等
AsyncTask使用注意的
- 对象只能在UI线程创建和执行,只执行一次
- 默认串行执行,并发用executeOnExecutor()
- 线程池核心线程分别为1和5
其他
- ICMP协议(网际报文控制协议,包括询问报文和差错报告报文)
- 编译原理(词法分析,分析关键字,单词等,谁是谁;语法分析,分析语句要做什么;语义分析,分析这样做对不对,比如类型不匹配等)
- 数据库连接join 数据库复习
- intent-filter和过滤器数量和规则(可以多个filter,只要匹配一个即可,action data 只要匹配任意一个就ok,category需要intent的category包含在filter里面)
- 算法题就不说了
美图一面 17min
美图笔试后以为挂了,结果面试官来了个电话说过了= =
- 关于专业成绩项目经验等等
- 问了下专业课和数据结构之类,没有详细问
- 个人的工作意愿,对美图的了解和未来的一些计划打算等
- Java和安卓的异同
- Java的内部类
- 线程安全
- Java的引用类型
- 还有记不住了 = =
美图二面 17min
- 自我介绍、学业、专业、项目
- HashMap线程安全吗?为什么?用什么替代?
- app用户按了Home键的话,开发者要注意什么?
- View的一个绘制过程
- 多态,方法的重写和重载区别
- 个人的一些兴趣爱好和职业规划
- other
今日头条一面 30min
- static关键字的用法和意义
- synchorized关键字
- SharePreference的apply()和commit()
1.apply方法失败成功没有返回值,commit有
2.apply先写入内存,并发时后面会覆盖前面,commit直接写入磁盘,并发时会阻塞
3.并发commit时apply在执行或者其他commit在执行,commit会阻塞
- Activity和Fragment生命周期,onDestroy调用情况(进程异常终止或者被后台强制回收时是不会调用onDestroy的,包括Fragment)
- ThreadLocal原理
- RecyclerView内存多少个item和怎么获取当前可见view的个数
- 自定义View
- TextView之类的hint怎么实现(一开始说了自定义View和仿写源码之类的,后面说了用一个view进行显示和隐藏,其实还有属性drawableLeft等)
- SparseArray和HashMap(ArrayMap)
关于SparseArray和ArrayMap
今日头条二面 30min
- service的生命周期(两种),bindService的context被回收了,service还存活吗?
- 自定义View,draw的具体逻辑,自定义过最复杂的View是什么?
- Handler消息机制
- AIDL机制,以及阻塞和监听等
- RecyclerView怎么进行滚动的
- 算法题:两个大数怎么相加?Long放不下。
解法:使用链表,每一位是一个结点,第一个节点开始两个链表分别遍历按位(结点)相加,进位和前面相加就可以。(在面试官提醒下勉强解答出来= =)
腾讯笔试后一面(现场面) 50min
- 手撕代码
- 算法题,100个石头排一列,A和B轮流取,一次可以去任意一个和相邻两个,A有没有必胜策略,当时题意都没搞懂,自然解不出。原题在《编程之美》里面,有变形
- RecyclerView的缓存原理,二级缓存和四级缓存究竟怎么回事?死磕底层,偏偏我提了这个
- 死磕Java某些底层,比如HashMap扩容时链表怎么迁移?为什么?hashcode底层怎么实现?
- 50分钟都在讨论底层,凉透了。面试官建议说我代码风格不好(字丑手写代码有什么办法= =),建议简历上的东西要深入研究到底为止。凉透了
网易有道一面 37min
第一天投第二天就电面了,最后知道是急招,虽然我时间不符合他们要求,但是就当是打怪升级吧
- 关于我项目的MVP,为什么要MVP,有什么好处?还有项目里某个函数为什么要那么写
- 设计模式以及为什么要使用设计模式?举例说明
- 面向对象的特点和好处,封装继承多态之类
- RxJava和Retrofit的好处
- Android的线程安全和线程建立,List集合相关等
- 创建线程的方式,答了Thread,runnable,线程池等,面试官一直问还有吗?最后提示RxJava的线程,但是我不知道他怎么实现的
- 数据库事务的特点以及为什么要有事务
- static关键字
- Java内存模型
- Java垃圾回收机制
- Android内存泄漏
- OOM
网易有道二面(现场面)
- 手撕代码(字符串单词标点符号顺序截取,不许用split,凉凉)