蚂蚁集团面试复盘 | 面试题复习

蚂蚁实习一面复盘总结4.13

算法题

1、设计一个算法,求第k个最大的数;

  • 直接排序求第k个
  • 使用选择排序、冒泡排序、插入排序等排到第k个就返回
  • 更快的方法:快排的分治法、最小堆最大堆法,当场写出来还是很难的

2、写单例模式

面试部分

1、RabbitMQ如何保证消息可靠性?

  • 生产者、消费者、消息队列本身

2、RabbitMQ如何保证消息有序性?

  • 出现乱序的情况:一个队列多个消费者、一个队列对应一个消费者,但预取消息prefetch>1
  • 解决办法:拆成多个队列,一个队列对应一个消费者;设置prefetch=1

3、保证消息不重复消费?

  • Redis去重;redis去重存在问题:
    • 当消息消费出现了异常,一般是需要broker重推消息,但是这个这个时候发现redis中已经存在消息id;所以redis去重不支持重复处理;
    • 如果在处理的过程中,如果redis宕机了,redis的数据没有恢复,那么redis去重失效;
    • 所以redis去重一般来说只适合短时间内的大量重复请求;这种情况下不够好,所以需要使用另一种方案:幂等性;
  • 利用幂等性;利用数据库键的唯一索引特性,消息重复插入报错,不再消费;

4、缓存的一致性怎么保证?

  • 旁路缓存模式
  • 缓存双删模式
  • 分布式锁

5、缓存存在ABA问题怎么解决?

  • 线程1写DB更新为A,线程2写DB更新B,此时B先更新缓存,A再更新缓存,缓存中一直存的是A(本来应该为B)

6、分布式锁原理?

  • set、set nx ex 、线程标识锁、lua脚本原子性判断释放
  • 使用lua脚本有什么问题吗?
    • 某些真正的线上运行是禁止lua脚本的;因为安全、性能、维护等原因?可恶啊应该问问面试官到底是什么原因的。

7、redis常用数据结构?

8、跳表?

9、场景题:给一台云端的2CPU4G阿里云机器,有20亿个整数,从中找到出现次数最多的一个数据是什么?有什么办法?

参考:

经典面试问题: Top K 之 ---- 海量数据找出现次数最多或,不重复的。 - 指尖下的幽灵 - 博客园 (cnblogs.com)

如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数 - 腾讯云开发者社区-腾讯云 (tencent.com)

大数据相关题目

第一眼思路:

可以采用哈希表来统计,把这个数作为 key,把这个数出现的次数作为 value,之后再遍历哈希表哪个数出现最多的次数最多就可以了。
但是内存不足。算一下,key 和 value 都是 int 型整数,一个 int 型占用 4B 的内存,所以哈希表的一条记录需要占用 8B,最坏的情况下,这 20 亿个数都是不同的数,大概会占用 16GB 的内存。(1GB= 10^9B, 10亿=10^9)

真正解法:

通过哈希法分成8份小文件, 一份小文件就是2GB,;装入到4GB内存中,2GB是key, 2GB是value。

通过哈希函数,一般整数能按照顺序均匀的分布在不同的文件中。比如-21亿~-15亿分布在文件1,-15亿~-10亿分布在文件2…15亿~21亿分布在文件8。因为hash函数使得同一种数不可能被散列到不同的小文件上。

然后对每一个小文件用哈希表来统计其中每种出现的次数,这样我们就可以得到16个小文件中各自出现次数最多的数,还有各自的次数统计,接下来选出16个小文件各自的第一名中谁出现的次数最多即可

如果这 20 亿个数数值比较集中的话,怎么优化?

如果给的这 20 亿个数数值比较集中的话,可以先把每个数先做哈希函数映射,根据哈希函数得到的哈希值,再把他们存放到对应的文件中,如果哈希函数设计到好的话,那么这些数就会分布的比较平均。

如果给的这 40 亿个数中数值都是一样的,那么哈希表中,某个 key 的 value
存放的数值就会是 40 亿,然而 int 的最大数值是 21 亿左右,那么就会出现溢出,该怎么办?

  • (把 int 改为 long 会占用更多的内存,同时拆分成更多文件,但不是最佳答案),可以把 value 初始值赋值为 负21亿,这样,如果 value 的数值是 21 亿的话,就代表某个 key 出现了 42 亿次了。

那我如果把 40 亿增加到 80 亿呢?

以一边遍历一遍判断,如果在统计的过程中,发现某个 key 出现的次数超过了 40 亿次,那么,就不可能再有另外一个 key 出现的次数比它多了,那我直接把这个 key 返回就搞定了。

聊天环节

  • 我:笔试做的很差,笔试占比重要性多大?

    • 面试官:看情况,横向对比,可能题目难别人分也不高。考差了也没事,你才大三,还有机会。(婉拒了呗T_T)

    • 你有什么打算吗以后?打算考研保研工作?

    • 喜欢搞算法吗? -也挺有趣的

    • 关注chatGPT吗?-天天用

      • chatGPT出来以后,很多东西不一样了,简单的代码、基础工程工作容易被替代

      • 算法、AI的应用、智能化的应用是未来的一个趋势

      • 这些方面的应用需要更高的背景,因为现在工程技术红利时代已经过去。

    • 所以就是叫我去深造、读研是把T_T , 真是为我考虑啊,用心良苦T_T

    • 本科生和研究生投递简历比例不足 1 : 1 ,本科生简历少,连面试官都感到夸张,因为本科生基数大呀!简历却那么少。

本文链接:https://my.lmcjl.com/post/4798.html

展开阅读全文

4 评论

留下您的评论.