面试题记录

今天去某互联网公司面试,从3点一直面试道6点多,面的怎么样倒不清楚,有几道题挺有意思的,这里记录下。

1.区间合并
写一个方法将如下区间合并:
例如输入:
[1,2],[4,6],[5,8],[10,11]
输出:
[1,2],[4,8],[10,11]
思路:先排序,然后尝试将相邻两个区间合并,遍历整个区间即可;

public List<Order> merge(List<Order> list){
  //...
}

2.求进行中订单的最大数量
假设订单都有订单ID,开始时间StartTime以及结束时间EndTime(时间单位均是秒),那么如何求某一天24h内,进行中订单的最大数量?
思路:这道题没有想到特别好的思路,直接是用遍历处理的。。。这个可以研究下。。。

3.判断IP是否在IP黑名单中
IP黑名单是有IP地址区间表示的,比如【192.168.100.1,192.168.101.255】,然后有很多个这样的黑名单BlackList,现在要写一个方法,如何快速的判断一个IP地址,是否在这个黑名单中。
思路:IP地址是字符串,字符串比较太慢,可以将IP地址转化为一个整数,这样就相当于判断整数是否在这些区间中了,所以步骤如下:
1).转化为整数;
2).将区间排序;
3).将区间合并;
4).用二分法查找有序区间,判断是否在区间内。


更新:突然想到第二题,可以这样优化:
1)排序
2)然后依次从列表中取区间,进行合并;
3)如果两个区间有交集则计数器加一,区间变成交集区间,再继续,直到和下一个区间没有交集为止,这个时候记录一下这个计数器的值,那么这个值就是已处理过区间中,同时派发订单的最大值,把这个当前最大值放入一个集合;
4)接着重新计数,重新合并区间,知道所有的记录都处理完毕;
5)从计数集合中找出最大值即可。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!