今日头条内推一面

                                今日头条内推一面

       大半夜的,清明节放假,一室友回家了,一室友在旁边吃鸡,还有一个在玩csgo,用putty连云服务器老是连接失败,很气,还是用virtualbox安装一个centos虚拟机算了,虽然内存有点不够烧,老是爆到70%,但只要不开flash其实也还好。安装期间刚好抽个空来写写头条内推面,也算是回报广大爱技术爱分享的小伙伴们了,头条的这三轮技术多亏了小伙伴们的面经。

      头条是曾经在头条实习的一个学长内推的,Android开发实习岗,其实我已经好久没认真做Android了。说实话,我是在内推简历投上去后才开始复习Android的,因为我的第一志愿还是做Java后台,阿里Java内推挂后真的很伤心,天天跟一考研的哥们蹲铁道破烂的图书馆,以为这样就可以减少一些心里的不安,真的很无奈。同时内推的腾讯短视频和直播的Android APP岗和头条的Android开发岗,于是乎就开始复习起了Android。

      其实我从大一第一个学期就开始学习Android了,但那时候连Java都还不怎么熟悉,学Android完全就是好玩,只会简单的控件使用,给控件添加监听啥的,我记得我做的第一个Android APP就是一个计算器,可以计算加减乘除、乘方、开方、求指数啥的,还添加了一个24点游戏,不过现在想想,那个算法写的是真的烂,直接暴力求解了,那时,能够暴力求解已经花了我一通宵了,现在通宵真的有点hold不住了,不得不服老,哈哈。最搞笑的是那时候,没有findViewById就直接让变量setOnClickLinstener了,直接就空指针了,当时又不懂怎么查看logcat,调了一通宵的bug,然后早上五点找出来bug了,调好了,计算器正常运行了,终于能算出结果了,赶快就发给老爸玩玩,老爸不一会就回我了,说我界面做得太丑了(老爸老妈在菜市场开店子,每天1点就要起床干活),其实我当时做的界面是白色的底+亮绿色的按钮,现在想来真是辣眼睛。当时真是少年儿郎,做出一点小东西就想给父亲看,想向父亲证明些什么,相信每个男孩都会有这种经历。去年回老家过年,老爸主动给我递烟,劝我喝酒,跟我谈有没有和女生开房的事,我竟然都面不红心不跳的,可能是人越长大就越骚了吧,哈哈。从大一到大三,这三年,Android也是一直在学,后面开始搞线程,搞网络,搞进程通信,搞四大组件,搞各种新奇玩意,也做过几个Android APP项目,不过,是真的没想到最后第一份工作是做Android开发。大一时想的是做人工智能,大二时觉得自己脑袋不够聪明,人工智能知道的还没有学弟们多,学弟们说起人工智能啥啥名词时,我有时候居然完全不懂,当场还装正经,回到寝室赶快百度一波,免得下次再说起闹笑话。于是乎开始决心做Java Web开发,搞Java EE那套东西弄了很多,自己写过WebServer中间件、ORM框架、Spring框架,做过很多网站,虽然最后基本上都没做成多大气候。大三开始接触那些分布式和消息中间件啥的,最后还是得面对找实习,面过四轮阿里后才知道面试真的是套路深啊,还好寒假时把《深入理解Java虚拟机》和《Java并发编程艺术》看了两三遍,能够根据自己的理解跟面试官扯上几十分钟。

       不扯这些毒鸡汤了,简单写写头条一面。

       约的是周一下午3点半,一面应该是个开发人员,视频面试,视频那边是个很年轻的小哥,人特别热情,一看就知道是个特别好相处的人。刚开始信号老是不好,我以为是我这边的网不好,最好发现是他的网不行。他换了个网后就开始正式面试了,他那边是头条的工作大厅,跟网上的图基本吻合,特别现代化的那种,如果事先没有了解,肯定会以为是在某个高级餐厅。

       起先就问我项目,哎,项目就那几个,把阿里面试那一套搬上来,不过由于面阿里是java后台,头条是Android,所以就主要讲了Android APP的项目,面试官就问了用的啥网络请求框架,我说okhttp,然后我就开始讲okhttp如何提交请求的,如果处理响应,如果更新UI。讲到更新UI这里,面试官就接着问为嘛不能在子线程中更新UI,我就说在子线程中更新UI会报CalledFromWrongThreadException异常,面试官就问了,为嘛会抛出这个异常,我说因为子线程中可能会进行耗时操作,如果能在子线程中直接更新UI的话,会导致界面阻塞,让用户交互感变差,因为Android系统平台就规定不能直接在子线程中更新UI。他接着问,既然不能直接更新UI,那么应该怎样更新UI呢。我说基本上所有的更新UI的方式都是基本消息队列和消息循环的,就是把要更新UI的消息放入消息队列中,然后消息循环就会从消息队列中取出消息,在UI主线程中更新UI,这样,UI主线程就不会执行耗时操作,仅仅做View操作和用户交互。Android的消息循环机制主要是用Handler来实现的,在UI主线程中创建一个Handler实例,然后在子线程中使用这个Handler实例发送一个消息,消息循环就会自动从消息队列中取出消息进行处理,调用Handler的handleMessage方法,行参就是一个Message对象,这个Message对象就是在子线程中Handler实例发送的消息,在handleMessage方法中就可以直接更新UI了,因为handleMessage是在主线程中执行的。面试官问为什么就能确定是主线程呢?我说其实也不一定是主线程啦,在什么线程创建的Handler实例就会在相对应的Looper中执行,由于是在主线程中创建的Handler对象,因为会在主线程中执行。如果是在子线程中创建的Handler对象,那么这个Handler其实是没有Looper的,发送消息会报错,就需要为这个子线程创建一个Looper,然后调用Looper对象的loop方法,就可以让一个消息循环运行起来。Handler用来处理Message,会先判断Message对象有没有Callback属性,如果Message的Callback不为空,就直接用Message的Callback属性的call方法来处理,如果为空的话,就判断Handler的Callback是否为空,不为空的话就用Handler的Callback的call方法来处理,如果为空的话就用Handler的handleMessage方法来处理。面试官问为什么每个线程都会找到自己的Looper,我说应该是用ThreadLocal来储存的,ThreadLocal可以为每个线程都保存一份自己的数据备份,当然也可以为每个线程来保存Looper。面试官说嗯,表示默认。

       然后问了下我Android的事件分发机制,我说Android的事件分发主要涉及到三个方法,分别是dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent,事件分发就是在dispatchTouchEvent方法中,如果是一个VIewGroup对象,在dispatchTouchEvent中,就会调用onInterceptTouchEvent方法来判断ViewGroup是否要拦截这个事件,如何返回true就表示拦截,返回false表示不拦截,如果拦截的话,就会调用ViewGroup的onTouchEvent,如果有OnTouchListener的话,会根据OnTouchListener的onTouch方法的返回值来决定是否调用onTouchEvent方法,而在onTouchEvent又会在Click前面执行,所以优先级是OnTouchListener的onTouch方法大于onTouchEvent方法大于Click。如果onInterceptTouchEvent方法返回false,表示不拦截,就会调用子View或子ViewGroup的dispatchTouchEvent方法,然后继续事件分发。如果是View的话,就不会有拦截方法,因为View没有子View,直接交给自己处理了。并且,如果有某个对象返回了true,也就是消费了这个事件的话,就表示这个事件的一系列都会交给这个对象处理,一系列表示down开始之后的一系列。感觉事件分发机制回答得还行,面试官没有再追问了。

      接下来问了下我Java的基础知识,比如说线程、线程同步与通信,还有Java的类加载机制,我就把阿里面试里的Java基础那套扯了出来,也扯了十分钟左右吧。最后面试官让我做一个算法题,是从一个数组中找出一个子数组,使之和最大,大数组中的元素为正数,0以及负数。我刚开始的想法就是动规,写了20分钟也没写出来,面试官说我的想法太复杂了,其实最后也没写出来,但面试官还是让我过了,让我等几分钟,他去叫下一轮的面试官。我大大地松了一口气,算法没写出来也能过,哎,老天保佑老天保佑。于是乎,趁着找下一轮面试的间隙,我赶快就去百度了一下这个题的解法,网上的解法主要有两种,一种是用分治,把原数组从中间分成两部分,子数组要么是在原数组左边,要么是在右边,要么横跨中间。左右可以递归求解,中间的话,直接扫描一遍就可以了。这样的话,时间复杂度大概是nlogn吧。还有一种时间复杂度为n的解法,就是用一个max来保存最大值,用now来保存当前和。从左到右扫描,当然左边扫描时要保证加上这个当前值后和更大了,其实就是一个动规的思想。时间复杂度大概是n,下面是代码

int max,now;

max = a[0];

now = a[0];

for(int i=1;i<a.length;i++){

    now = max(a[i],now+a[i]);

    max = max(max,now);

}

猜你喜欢

转载自blog.csdn.net/qq_31728311/article/details/79823594