头条面经

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33277870/article/details/78118804

先来波面经,等这段时间秋招有空闲了再来好好总结。

首先第一个,手写堆排快排(问题是求前k个大的数,或者第k大的数)。

第二个,intent的作用,为什么采用intent去连接四大组件(因为在各大组件将要回收的时候,可以将其保留)。

第三个,事件滑动机制,cancel原理(滑动是如何取消的),viewpager里面嵌套listview是怎么实现的,为什么没有滑动冲突。

第四个,线程池原理。如果让我去设计线程池,怎么设计,http怎么设计线程池,bitmap怎么设计线程池。okhttp线程池连接采用什么原理。

第五个,算法题。给你k个公交车到达时间表,每个表(数组)都是按时间顺序,要求找出其中最小时间段,在这个时间段可以等到每一辆公交车。

比如,

k1 0,3,8,26

k2 2,6,9,10,15

k3 4,8,10,15,16

最小区间就是 8,10。

有两种解决思路,第一种,把所有表压缩为一个表(hashset试试),采用左右两个指针,维护这个区间。右指针右移动时,注意用hashmap统计每辆车在这个区间的个数,如果没有,说明这个区间刚好包含这个,如果已经有了,hashmap对应的加1,。左指针右移动时,将对应的hashmap的值减去1。这个题目的关键,在于拍成一个表,维护这个hashmap和表中每个点对应的公交车,以及当前区间拥有的公交车数量。

第二种,用堆来解决,先把每个车的第一个元素加进来,维护一下最小堆,每次加的元素与堆顶处于同一列。

比如,先把0,2,4加进去,堆顶为0,最大元素为4,然后把0的下一位3(k1公交车),加进去,加进去之前与最大值作比较,如果比最大值大,就把最大值置空,最小变为2,最大为4,区间为4-2=2,再把2的下一位6加进去(k2公交车),6比当前最大值4大,最大值变为6,维护一下堆,堆顶变成3,6-3=3,一直这样做下去,直到得到答案为止。


这两个题目都不难,代码就不贴了。



展开阅读全文

没有更多推荐了,返回首页