小米搜索开发工程师实习生面经

3月15号收到面试通知要求3月20号去武汉小米现场面试,一共面了两轮。

一面:
自我介绍,项目介绍,问了很多关于项目方面的东西
红黑树
用的哪一版本的c
c 11用过吗?c 11新特性了解哪些,智能指针用过吗?
java的hashmap底层是怎么实现的?
堆排序,详细问了怎么建堆,然后引申出了海量数据中找前k个数?
KMP算法
hadoop,spark,hbase一些大数据的东西
一面好像只问了这么多,面试过程中还让我手写了两道算法题
一道是判断链表是否有环
另一道是旋转数组中找目标值,好像是剑指offer上的题。
一面就问了这么多,大概1个多小时,面试官非常nice,面完后还给我详细介绍了部门的业务,虽然听不太懂😢。然后跟我说我一面表现还不错,如果二面表现也还不错,会有北京那边的三面。

一面结束后,面试官叫来了他的同事,说了一下面试情况、刚才问了哪些内容。当然这些都是我偷听到的,因为他们就站在我不远处交流😹。

等了差不多五六分钟,刚才一面面试官叫的同事就过来给我二面了。

二面很简单,基本没问什么东西
在自我介绍后,就让我写了两道题
第一题是求数组中两数之和等于target的下标对,相同的两数不能重复输出
第二题就是冒泡排序

写完这两题后面试就结束了,面了不到20分钟😹😹😹


一二面结束后大概过了几天,收到了小米北京总部面试通知,约我上周三也就是3月27号电话面试,并让准备电脑。

三面:
自我介绍,项目,问到了项目里面用的RTI DDS,问的比较细
malloc和new的区别
c 里面的堆栈
全局变量和宏定义
c 11的智能指针,什么是野指针
vector,如何把百万个数据放进vector
c 里面的一些容器底层是怎么实现的,问了哪些容器记不太清了
jvm内存模型和gc算法

然后就让我在一个在线文档上写题

第一道,实现std::string,主要让写了构造函数,析构函数,=重载

第二道,求数组里面逆序对的个数,也是剑指offer的原题,然而lz并没有刷过这道题
刚开始除了暴力法并没有其他思路,然后面试官就先让我写个归并排序,花了快10分钟写出归并排序后,在面试官一点一点的提示下终于写出来了😹😹😹😹。

三面面了快一个半小时,面试官人很好,又给我说了一下武汉这边的业务,然后问我有什么想要问的,我就问了大概几天之内能知道面试结果,面试官就说最迟一个星期,一个星期后没有通知就是凉了😪。


其实面完三面lz就觉得凉凉了,因为c 里很多东西回答的并不太好,算法题也是在提示下完成的。但是三面面完两个小时候就又接到了三面面试官的电话,问我什么时候能去实习,还和我定好了实习时间,说hr后面会联系我。

当时真的很开心,毕竟是拿到的第一个实习offer。

以上就是我小米的面试经历,希望对大家有所帮助#小米##面经##实习##Java工程师#
全部评论
老哥来金融港实习么,我是华科的,正在小米实习
点赞 回复 分享
发布于 2019-04-05 09:14
老哥,我们应该是一个组。
点赞 回复 分享
发布于 2019-04-05 09:51
小米现在是只有去现场面么?应该没hc了吧
点赞 回复 分享
发布于 2019-04-05 09:25
想问一下,小米的面试写题时怎么写的。记事本还是纸笔这样的。
点赞 回复 分享
发布于 2019-04-05 09:12

相关推荐

04-27 16:50
已编辑
门头沟学院 Java
1. mysql删除表语句是什么?drop和truncate区别?2. 删除一行数据的sql3. 查询一张表所有的数据的sql4. 查询一张表有多少条数据sql。  count(1)和count(*)区别5. i++和++i区别6. 介绍下重载和重写。  构造方法可以重写重载吗?7. arraylist和linkedlist的区别8.解释一下深拷贝和浅拷贝9. 如果有三个线程,我如何能保证顺序执行.方法1: 使用join()join() 方法可以确保一个线程在另一个线程执行完毕后才开始执行。通过合理地调用 join(),可以实现线程的顺序执行。方法2:使用countdownlatch/semaphore方法3: 使用锁和原子类,wait() + notifyAll()方法4: 使用completablefuture10. 如果有一个 T1 线程,想把 T2 线程加到 T1 里面,怎么实现?方法1. 使用join()Thread t2 = new Thread(() -> {    // T2 线程的执行逻辑    System.out.println("T2 线程正在执行");});Thread t1 = new Thread(() -> {    try {        System.out.println("T1 线程开始执行");                // T1 线程在此处等待 T2 线程执行完成        t2.start();  // 启动 T2 线程        t2.join();    // T1 等待 T2 完成                System.out.println("T2 线程已完成,T1 继续执行");    } catch (InterruptedException e) {        e.printStackTrace();    }});t1.start();方法2. 使用future.get()ExecutorService executor = Executors.newSingleThreadExecutor();Future future = executor.submit(() -> {    // T2 线程的执行逻辑    System.out.println("T2 线程正在执行");});Thread t1 = new Thread(() -> {    try {        System.out.println("T1 线程开始执行");                // T1 线程在此处等待 T2 线程执行完成        future.get();  // 阻塞直到 T2 完成                System.out.println("T2 线程已完成,T1 继续执行");    } catch (InterruptedException | ExecutionException e) {        e.printStackTrace();    } finally {        executor.shutdown();    }});t1.start();方法3. 使用countdownlatchCountDownLatch latch = new CountDownLatch(1);Thread t2 = new Thread(() -> {    try {        System.out.println("T2 线程正在执行");    } finally {        latch.countDown();  // 完成时减少计数    }});Thread t1 = new Thread(() -> {    try {        System.out.println("T1 线程开始执行");                t2.start();  // 启动 T2 线程        latch.await();  // 等待 T2 完成                System.out.println("T2 线程已完成,T1 继续执行");    } catch (InterruptedException e) {        e.printStackTrace();    }});t1.start();11. a=a+b 和 a+=b的区别a = a + b,如果 a 和 b 的类型不同(如 a 是 int,b 是 double),需要显式强制类型转换,否则会编译报错。即:double a= 1;int b = 2;a = (double) (a+b); a += b,会自动执行隐式类型转换,将结果转换为 a 的类型。13. 数据库的三大范式如答案有错误欢迎指正
查看24道真题和解析
点赞 评论 收藏
分享
评论
点赞
15
分享

创作者周榜

更多
牛客网
牛客企业服务