以上数据引用自 topK问题最小堆和快排哪个快。所以偷鸡就可以解决第一层的问题。
public int findKthLargest(int[] nums, int k) {
PriorityQueue queue=new PriorityQueue(k,new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
for(int i=0;i<nums.length;i++){
queue.add(nums[i]);
if(queue.size()>k){
queue.poll();
}
}
return queue.peek();
}
这是我leetcode乱写的第k大个数啊。
面试官对我的偷鸡取巧并不满意啊,他需要我提速,这个速度不行啊。
What??是有时间复杂度更低的吗?不不不,这是一道核心竟然是一道多线程的题目。
-
将10亿的数据分片,通过分治的思维对数据进行第一次处理。
-
开启多线程然后对其进行这些分片的数据进行优先级队列操作。
-
然后每个子线程筛选出其中最大的k个数
-
当所有线程执行完毕之后合并数据
-
是不是考虑下多少个数据一分片,然后如何把效能提升到最高的问题?
-
构建多少个线程读取效率是最高的?
这个都是我没想到的,各位大佬有想法的可以聊一下啊。
============================================================================
这题乍一看卧槽貌似不难,foreach循环碰到一个空格或者标点的情况下sum++,是不是就可以解决这个问题。
然而事情并没有想想的这么简单。面试被问到这种问题最难的是什么,可能是对于这题目真实的边界问题的思考。
-
如果这篇文章内容很大怎么办,会不会把内存吃光?
-
如何给单词去除重复?
将其转化成IO流,逐行读取流,之后对这个输入内容进行一次计数操作,是不是就可以解决这个问题呢。
卧槽,这个真简单HashSet啊!!!!那么如果海量数据我是不是又炸了?
卧槽,死亡螺旋吗。或许我们可以考虑下用hash的方式来解决,只保留单词的hashcode,是不是可能可以解决呢。
方式的话基本也和上面是完全一样的,只要把数据分片,之后多线程调度,然后合并结果就可以了。
====================================================================
我问了下后端大神,这些应该都是mapreduce里面出现的原题啊,都是和海量数据相关的,有兴趣的可以自己去查下。
别说了,这些都是下场之后想了想总结的,当场面试就是懵逼的,边界个锤子。
小编在网上收集了一些 Android 开发相关的学习文档、面试题、Android 核心笔记等等文档,希望能帮助到大家学习提升,如有需要参考的可以直接去我 CodeChina地址:https://codechina.csdn.net/u012165769/Android-T3 访问查阅。
尾声
一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!
为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!
再次感谢所有给我提供过题目的朋友们,感谢一路有你!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!