阿里面试Android岗,尽然碰到这两道算法题,太难了吧!

以上数据引用自 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??是有时间复杂度更低的吗?不不不,这是一道核心竟然是一道多线程的题目。

  1. 将10亿的数据分片,通过分治的思维对数据进行第一次处理。

  2. 开启多线程然后对其进行这些分片的数据进行优先级队列操作。

  3. 然后每个子线程筛选出其中最大的k个数

  4. 当所有线程执行完毕之后合并数据

我猜测的第三层


  1. 是不是考虑下多少个数据一分片,然后如何把效能提升到最高的问题?

  2. 构建多少个线程读取效率是最高的?

这个都是我没想到的,各位大佬有想法的可以聊一下啊。

一篇文章内的单词数量

============================================================================

这题乍一看卧槽貌似不难,foreach循环碰到一个空格或者标点的情况下sum++,是不是就可以解决这个问题。

然而事情并没有想想的这么简单。面试被问到这种问题最难的是什么,可能是对于这题目真实的边界问题的思考。

  1. 如果这篇文章内容很大怎么办,会不会把内存吃光?

  2. 如何给单词去除重复?

是不是可以考虑逐行读取呢?


将其转化成IO流,逐行读取流,之后对这个输入内容进行一次计数操作,是不是就可以解决这个问题呢。

单词重复的问题


卧槽,这个真简单HashSet啊!!!!那么如果海量数据我是不是又炸了?

卧槽,死亡螺旋吗。或许我们可以考虑下用hash的方式来解决,只保留单词的hashcode,是不是可能可以解决呢。

同样的这个也可以使用多线程分片去优化


方式的话基本也和上面是完全一样的,只要把数据分片,之后多线程调度,然后合并结果就可以了。

总结

====================================================================

我问了下后端大神,这些应该都是mapreduce里面出现的原题啊,都是和海量数据相关的,有兴趣的可以自己去查下。

别说了,这些都是下场之后想了想总结的,当场面试就是懵逼的,边界个锤子。


最后


小编在网上收集了一些 Android 开发相关的学习文档、面试题、Android 核心笔记等等文档,希望能帮助到大家学习提升,如有需要参考的可以直接去我 CodeChina地址:https://codechina.csdn.net/u012165769/Android-T3 访问查阅。

尾声

一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!

为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!

再次感谢所有给我提供过题目的朋友们,感谢一路有你!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值