小米面试题
学长1
大家可以投一下小米的推荐算法。
一面:问两个有序大数组合并成一个数组的最佳方法,还有快排,问了所有项目。
二面:是问推荐算法的业务实现,还有如果你自己做一个推荐,你会怎么选择模型、算法。
三面:数据结构的查找,新增,删除的时间复杂度、还有各种数学问题,然后写了二叉树的查找、还有根据算法题写了一个递归,差不多就这样就过了
1)技术部分
(1)Java8的新特性?
(2)Java8的hashMap为什么采用数组+链表+红黑树?
(3)垃圾回收的算法,CMS和G1的比较,用什么监控JVM?
(4)Kafka对接SparkStreaming?
(5)线程池好处是什么,什么场合用?
(6)Zookeeper的选举机制,以及我们还可以用Zookeeper做些什么?
(7)Flume采集数据的优缺点,还有什么可以代替它,也可以通过自己公司的业务情况自己开发。
(8)Spark Streaming和Storm,Flink的比较,以及各自的优势?
(9)怎么从10亿条数据中计算TOPN?
学长2
1)基本信息
(1)面试地点:小米6期
(2)面试时长:共2个半小时
2)一面(下午3点30分到4点10分):
(1)自我介绍
(2)Spark Streaming和Flink区别
(3)MR和Spark引擎的区别
(4)引起Shuffle的算子有哪些?
(5)Flink+Kafka保证精确一次消费相关问题
(6)Zookeeper的应用
(7)Java中HashMap和TreeMap区别(记不清是不是这个问题了)
(8)SparkStreaming保证精确一次消费
(9)给出数据倾斜解决方案
(10)被问到任务划分的源码(DAGScheduler划分)
(11)给一个整形数组,找出最大的连续子集
(12)给一个数组,一个值,找出第一次出现的两个数的和等于这个值的下标并存入List中(好像Letcode第一道题,双层for循环)
(13)Spark中划分宽窄依赖的底层原理:只说Shuffle划分Stage没用
3)二面(下午4点25分到5点10分):
(1)自我介绍
(2)手写SQL:(看着你写,注意)
表t1
页面id 点击 浏览 日期
page_id view visiable date
0 0/1 0/1
1 0/1 0/1
…
表t2
品类id 页面id
border_id page_id
a 0
b 1
a 3
a 4
b 0
…
找出各个border_id的view,visable个数 (join group by where count(if)…)
(3)JVM内存和调优
(4)Redis数据类型,事务(凭印象说的multi,exec,watch),持久化方式和区别,Redis中zSet底层实现是什么?
(5)Redis问的很细
(6)跑任务用的什么(Azkaban)?定点定时跑还是周期性跑?
(7)手画星座模型
(8)业务过程,维度,事实
(9)手写单例模式
(10)实时统计过的指标
(11)如何从0到1搭建数据平台?
4)**三面(**下午5点10分到5点30分):
(1)自我介绍
(2)B+树和B树底层,与二叉树的区别(手画) 不太会
(3)给你两个矩阵(txt文件,以\t分隔),让你用MapReduce实现两个矩阵相加并输出(每行打行号标记)
… …
5)四面:(下午5点35分到5点50分)
(1)了解上家公司情况
(2)入职相关事情
学长3
1)笔试:
(1)链表两两反转(搞定)
(2)验证二叉树是否符合以下条件:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。(我说我对二叉树不咋熟悉)
(3)求一个序列中的最长上升子序列的长度(搞定)
2)面试:
(1)Flink的状态后端
(2)说说rockDB状态后端,rockDB做状态后端有啥好处和缺点
(3)说说HDFS状态后端,它是怎么存储的状态的
(4)说说Flink中的keyState包含哪些数据结构
(5)Redis常用数据类型
(6)SparkStreaming是如何处理数据积压的,说说反压机制的令牌桶算法
(7)简单谈谈JVM辣鸡处理的算法,了解多少,分别是什么
(8)谈谈JVM内存的分布,方法区中都存些什么
学长4
1)语言基础:
(1)String类可以被继承吗?为什么?
(2)HashMap,HashTable,ConcurrentHashMap的异同?
(3)Java单例模式,Scala语言如何实现?
(4)实现快速排序算法
(5)设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2)Hive
(1)把每科最高分前三名统计出来 --成绩表Score(student_name,student_no,subject_no,score)
(2)找出单科成绩高于该科平均成绩的同学名单(无论该学生有多少科,只要有一科满足即可) --成绩表Score(student_name,student_no,subject_no,score)
(3)一个表 test(name,price),构建一个新表,将name相同的,price所有价格合并到一个字段里面
(4)如何将题3中price合并后的prices字段再拆分为多条记录?
3)Spark
(1)用户访问日志文件有两列,分别为日期和用户ID:(date,user_id),使用Spark统计每天的访问的记录数和用户数。
(2)在Spark中,代码的执行位置:
dstream.foreachRDD { rdd =>
val where1 = “执行位置1”
rdd.foreachPartition { partition =>
val where2= “执行位置2”
partition.foreach { record =>
val where2 = “执行位置3”
}
}
}
学长5
1)基本信息
(1)2019年11月10号:
(2)面试地点:小米6期
(3)面试时长:共2个半小时
2)一面(下午3点30分到4点10分):
(1)自我介绍
(2)Spark Streaming和Flink区别
(3)MR和Spark引擎的区别
(4)引起Shuffle的算子有哪些?
(5)Flink+Kafka保证精确一次消费相关问题(记不清了):我说的两阶段提交
(6)Zookeeper的应用
(7)Java中HashMap和TreeMap区别(记不清是不是这个问题了)
(8)SparkStreaming保证精确一次消费
(9)给出数据倾斜解决方案
(10)被问到任务划分的源码(DAGScheduler划分)
(11)给一个整形数组,找出最大的连续子集
(12)给一个数组,一个值,找出第一次出现的两个数的和等于这个值的下标并存入List中(好像Letcode第一道题,双层for循环)
(13)Spark中划分宽窄依赖的底层原理:只说shuffle划分stage没用
3)**二面(**下午4点25分到5点10分):
(1)自我介绍
(2)手写SQL:(看着你写,注意)
表t1
页面id 点击 浏览 日期
page_id view visiable date
0 0/1 0/1
1 0/1 0/1
…
表t2
品类id 页面id
border_id page_id
a 0
b 1
a 3
a 4
b 0
…
找出各个border_id的view,visable个数 (join group by where count(if)…)
(3)JVM内存和调优
(4)Redis数据类型,事务(凭印象说的multi,exec,watch),持久化方式和区别,redis中zset底层实现是什么?
(5)Redis问的很细
(6)跑任务用的什么(Azkaban)?定点定时跑还是周期性跑?
(7)手画星座模型
(8)手写单例模式
(9)实时统计过的指标
(10)如何从0到1搭建数据平台?
4)三面(下午5点10分到5点30分):
(1)自我介绍
(2)B+树和B树底层,与二叉树的区别(手画) 不太会
(3)给你两个矩阵(txt文件,以\t分隔),让你用MapReduce实现两个矩阵相加并输出(每行打行号标记)
… …
5)四面:(下午5点35分到5点50分)
(1)了解上家公司情况
(2)入职相关事情
学长6
1)笔试:
语言基础:
(1)String类可以被继承吗?为什么?
(2)HashMap,HashTable,ConcurrentHashMap的异同?
(3)Java单例模式 Scala语言如何实现?
(4)实现快速排序算法
(5)设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
Hive
(1)把每科最高分前三名统计出来 --成绩表Score(student_name,student_no,subject_no,score)
(2)找出单科成绩高于该科平均成绩的同学名单(无论该学生有多少科,只要有一科满足即可) --成绩表Score(student_name,student_no,subject_no,score)
(3)一个表 test(name,price),构建一个新表,将name相同的,price所有价格合并到一个字段里面
(4)如何将题3中price合并后的prices 字段再拆分为多条记录?
Spark
(1)用户访问日志文件有两列,分别为日期和用户ID:(date,user_id),使用Spark统计每天的访问的记录数和用户数。
(2)在Spark中,代码的执行位置:
dstream.foreachRDD { rdd =>
val where1 = “执行位置1”
rdd.foreachPartition { partition =>
val where2= “执行位置2”
partition.foreach { record =>
val where2 = “执行位置3”
}
}
}
2)面试:
(1)Scala中以下几个的区别
(2)Spark UDF与 Hive UDF区别
(3)Spark广播出去的信息可以修改吗?比如我广播的是配置信息,怎么改呢。
学长7
小米金融-平台开发方向
一面问了个算法题,第二面实在没时间推掉了
写算法的时候,最好问下用什么语言实现,比如我现在熟悉python, java反而忘记了好多,我就说用python实现吧
二叉树层级遍历
1
2 3
4 5 6 7
打印:
1
2 3
4 5 6 7
def levelOrder(self, root):
res= []
if not root:
return res
queue = [root]
while queue:
tmp1, tmp2 = [], []
for node in queue:
tmp1.append(node.val)
if node.left:
tmp2.append(node.left)
if node.right:
tmp2.append(node.right)
res.append(tmp1)
queue = tmp2
return res