头条面经

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

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

第二个,intent的作用,为什么采用intent去连接四大组件(因为在各大组件将要回收的时候,可以将其保留)。可以参考hongyang大神的博客(https://wanandroid.com/wenda/show/12574

第三个,事件滑动机制,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,一直这样做下去,直到得到答案为止。

 

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

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值