Android暑期实习面经部分笔试记录(一)

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,凉凉)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值