面试经验——小米

一面:

1. 快速排序,手写代码。

2. 堆排序,描述过程,纸上画出来。

3. 单例模式:懒汉模式和饿汉模式。

4. 线程池的实现原理,用到的数据结构,如何调度池内资源。

5. 用什么命令查找某个文件名?

6. 用什么命令删除某个文件和下面的所有东西?

7. sql语句:创建一个table。

二面:

8. 给定一个数组,数组中存放着线程的引用,根据该数据结构,设计一个线程池的方案,要求在取出空闲线程和归还线程的时候,复杂度为O(1),并且申请的辅助空间为常数级。

9. 实现双链表查找相交节点。(我实现了3种方法)

解答:

  1. 快排
private void sort(int start, int end, int[] num){
        if(start<end){
            int begin = start,last = end;
            int tree = num[start];
            while(start<end){
                for(;end>start && num[end]>=tree;end--);
                num[start] = num[end];
                for(;end>start && num[start]<=tree;start++);
                num[end] = num[start];
            }
            num[start] = tree;
            sort(begin,start-1,num);
            sort(start+1,last,num);
        }
    }
  1. 堆排序

    堆排序算法,没有比这一篇讲的再透彻的了,分析的很到位。

    存储堆的最好的数据结构就是数组,可以直接找到父节点或者对应的两个子节点,进行操作。

    在面试的过程中,面试官仅仅问了我建立小顶堆的过程;该过程总体由“一上一下”两个方面构成:

  • 一上:当前节点和兄弟以及其父元素的比较,和交换(如果有必要的话);
  • 一下:交换过后,当前位置的值跟以它为父节点的子节点的值进行调整疏导,并一直梳理到大小层次合适为止;
  1. 单例模式:

    懒汉模式(第一次使用的时候才会生成单例,类被加载的时候是不会生成单例对象的,此时为null):

public class Singleton {
    private static Singleton singleton = null;
    private Singleton() {//私有构造方法,防止该类被实例化。
    }
    public static Singleton getInstance(){
        if(singleton==null){
        sychronized(singleton){
        singleton=new Singleton();
        }
        }
        return singleton;
    }
}

饿汉模式:在类首次被加载(注意,不是使用)的时候就生成了单例对象。

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() {//私有构造方法,防止该类被实例化。
    }
    public static Singleton getInstance(){
        return singleton;
    }
}
  1. 线程池的实现要素:

队列、数组、线程(Thread)、get和giveback方法等。

  • 数组实现了对线程个数的控制和对每个线程的跟踪管控;
  • 队列指任务队列,表示将要分配给线程池工作的候选任务;
  • 线程(Thread)是存放在线程池中的每一个线程,需要使用时候拿出
  • 运行、运行完之后放回池中待命;
  • get方法:当线程池中仍拥有空暇线程时,得到一个空闲线程,加载任务运行,空闲记录中将其标记为busy;
  • giveback方法用于当线程池中空闲线程未达到池容量时,在某线程执行完处于空闲时,放回到线程池中待命,空闲记录中增加该线程;
  1. 使用find命令查找某个名字的文件

当时没有答上。详见find命令

  1. 删除某个文件夹及下面的所有文件命令:rm -rf
  2. sql语句创建一张表student,id为自增主键,name为字符串, age为int类型。

当时也没答对。应该是:

CREATE TABLE student(
id int identity(1,1) PRIMARY KEY,
name varchar(32)  NOT NULL,
age int NOt NULL
) 
  1. 给定一个数组,数组中存放着线程的引用,根据该数据结构,设计一个线程池的方案,要求在取出空闲线程和归还线程的时候,复杂度为O(1),并且申请的辅助空间为常数级。

按照要求,需要在O(1)时间内放回或者取出,而且不能申请O(n)的辅助空间,但是在任务中可以有一些标记字段(isBusy<是否忙碌>,originIdx<对应数组位置下标>等)。

经过考虑,我可以这样做:

在每次取出和放回 的时候都按照顺序依次存放,但由于每个任务中都记录了数组下标,而数组对应下标都存着该任务的引用,则当任务没有按照次序归还线程时,可将该线程和另外一个正在运行着的线程位置进行互换,从而达到按顺序归还的效果,同时修改两个互换线程关于busy和所属下标的值,这样,在取出的时候可以做到按照顺序取,达到O(1),放回的时候可以按照顺序放,在O(1)的复杂度内,交换两个线程的所属位置即可解决。

分析图如下:

  • 开始的时候,0到10都是空闲,则设立pointer指向busy区和free区的边界线,则此时的pointer应为0;
  • 当分配的时候,pointer++,变为1,然后把pool[0]分配出去;

    若还需要,则将pointer指向的分配出去,然后pointer++;

  • 某一时刻,假设pointer指向了5,则说明0到4都在忙;

    此时,若pool[2]对应的任务类回来了,则应该将其放入pool[4]中,pointer–,代表空闲的从4号开始。

  • 同时,假设Task4对应着原本从pool[4]中分配出去的任务,而4还没有回来,2先回来占用了4的位置,那么需要交换Task2和Task4的originIdx信息,让Task2的指向4,让Task4的指向2;并且让pool[2]和pool[4]的引用也调换过来,从而能在每次回收的时候通过这种交换位置操作达到O(1)。
  • 按照该思想写出get()和giveBack()方法。
  1. 双链表判断是否有交叉
  • 方法1:使用Set存放ListNode的引用;遍历每一个节点都在set中查找是否已有该节点,若遍历一遍之后没有找到重复的,则没有相交;否则有交叉;

    考官提出,若不许有额外的O(n)的辅助内存:

  • 方法2:将最后一个节点链到第二个头上,从而将问题转化为判断是否有环路的问题上,设置快慢指针,快指针一次2步,慢指针一次1步,直到快指针为null或快指针==慢指针。为null说明无环,相等则说明快慢指针相遇,有环路,因此有交叉。

    考官又提出,不能改变原有链表的结构

  • 方法3:首先分别求出两个链表的长度,抛开长度的差值,然后定义两个指针分别同时向下走,没走一次都相互比较,直到走到null或者相等为止。若为null则无相交;否则有交叉。

至此,两轮面试结束。考的问题都很基础,没有偏难怪,基础还需要打扎实。

时间: 2024-10-22 15:45:06

面试经验——小米的相关文章

一个兼职DBA的数据库运维经验 小米科技 [email&#160;protected] 2011

一个兼职DBA的数据库运维经验 小米科技  [email protected] 2011 报警监控系统粒度太大,不好用(我们公司现状)数据库状况:十个服务器,惠普HP380G7 戴尔R710 ,都做了主从全部sas盘 15K RAID10服务器内存24G数据库跟业务混用,不是专门给数据库用 导致出问题(我们公司现状)备份用的xtrabackup 数据库不大:160G 70G 30G程序支持分库分表 --------------------------问题 io util% 100%(学)正常io

2015阿里巴巴春季Java实习生面试经验

2015阿里巴巴春季Java实习生面试经验 一.笔试 大概今年四月初的时候在线进行了笔试,笔试题目都是考基础的,包括数据结构.计算机网络.操作系统.数据库原理等,Java基础的话不用说,个人建议可以去看一下<Java编程思想>这本书,这本书提到了许多细节的东西,是初学者提升Java基础的一本好书. 网上笔试不久,就收到了阿里的短信和邮件,说我通过了网上笔试和简历筛选,并叫我到网上去预约时间,我登录到网上的时候才发现,距离面试时间(5月5日~5月7日)还有差不多一个月的时间,因为我选择的面试地点

虎牙直播面试经验总结

1.虎牙直播黑盒测试面试经验总结 (1)首先,自己打印简历,最好是彩色版的(签到交简历时,有人是黑白色简历打眼一看很不舒服,尤其是有证件照的,黑白?呵呵,我们好像不缺这一块钱吧),邮件上写自带简历和黑色签字笔(意识大意忘记拿了,因为面试本来就没有啥经验,现在又忘记带签字笔,人更加方了,最后找人前台借了一只,虽然没有用到签字笔) ---------------总结1:出门一定要检查是否落下东西,像我粗心的这种可以看着邮件要求检查是否齐全,不然到时候如果面试地点人生地不熟,连个小超市都找不到,拿什么

面试经验-总集

一 Java后端 面试经验合集-Java后端<一> 二 产品经理 三 Web前端 四 经验与教训 1.明确岗位,禁忌海投. 海投事倍功半:无法聚焦.深耕于喜欢的岗位. 原文地址:https://www.cnblogs.com/johnnyzen/p/10201740.html

去BAT,你应该要看一看的面试经验总结(转)

来源微信公众号『easyserverdev』 http://mp.weixin.qq.com/s/UZljzFMjobo1wzCguY7NDg 说下我的面试经验吧,都是亲身经历,不喜勿喷: 我去年12月份从上一家公司离职,一直到今年3月份,基本上都在面试中度过来的. 先交代下背景:坐标上海,做技术开发,我本人面试的职位是linux服务器开发,最倾向的职位是服务器开发主程或技术经理.我本人也是上几家公司的面试官,因为接下来几年面临着成家养小孩,技术上也到了瓶颈期,虽然拿了不少offer,但是想综合

2019年六月前端面试经验总结

四月底从上家公司离职,五月六月陆陆续续面试了十几家公司,也拿到了几个offer.总体来说大环境和就业形势还是比较不乐观的,面试的人多,而招的人少,对前端的的要求也比以往要高,这些先不具体讨论,这里主要将各个公司面试时考察的技术点做一个归纳总结,方便大家面试时作为参考,也进一步巩固基础,查漏补缺. [前端基础] JS js 事件循环(宏任务.微任务.setTimeout) js 作用域.作用域链 闭包 This 指向问题 new 操作具体做了哪些事情 开发中用到了 ES6 的哪些新特性 js 实现

面试经验总结,每个求职者应该具有的职业素养

终于,可以确定自己可以拿到人生中的第一个offer了,算不上好,也算不上坏吧. 然后,晚上和一个已经工作两年的哥聊了聊我自己的求职经历,听完后,他给我提出了自己在近期求职中的一些缺点以及对未来人生的一种准备.回到家,赶忙自己总结了一下一些面试经验.(注意:不是教你如何去面试,而是强调的是你个人的求职素养以及做人做事的原则,可能有点笼统,但我相信不论哪个行业,那个职位,这些素养是你应该具有的) 1.做事前,有计划,有准备. 1.1了解市场行情,所在行业的平均工资 1.2了解工资的计算 1.3了解房

分享一下我的面试经验

第一次面试的时候,也许很多人会非常紧张 今天就由我跟大家分享一下我的面试经验 我们还是先从最开始的简历说起吧,先来让大家看下我的简历吧(仅供参考) 有哪些可以作为你的简历加分项?Github个人主页.Github点赞数.Fork数目.StackOverflow.CSDN账号.博客园账号.开源项目.写文章等等,这些都是非常有用的学习证明,所以平时应该多去活跃社区作贡献,开源自己的项目. 面试前准备好了,接下来我要开始说重点.切记,一定要刷题!一定要刷题!面试题肯定是必不可少的,往往这就决定了你这次

BAT求职大礼包 | 你的秋招网申时间余额不足,腾讯面试经验

腾讯-数据库版本如何单独升级,并且将原有数据迁移过去 在我们开发的应用中,一般都会涉及到数据库,使用数据的时候会涉及到数据库的升级.数据的迁移.增加行的字段等.比如,用户定制数据的保存,文件的端点续传信息的保存等都会涉及到数据库. ? 我们应用第一个版本是V1.0,在迭代版本V1.1 时,我们在数据库中增加了一个字段.因此V1.0的数据库在V1.1版本需要升级,V1.0版本升级到V1.1时原来数据库中的数据不能丢失, ? 那么在V1.1中就要有地方能够检测出来版本的差异,并且把V1.0软件的数据