常见面试题
一、
问题:
25匹马,5个跑道,每个跑道最多能有5匹马进行比赛,最少比多少次能比出前3名?前5名?
参考答案:
找出前3名最少需要7场就可以确定。首先我们将25匹⻢马分成5组,分别为ABCDE,5组分别进行比赛决出各小组名次;接着让各小组第一进行比赛决出冠军,我们假设各小组第一分别是A1, B1, C1, D1, E1,并且速度A1 > B1 > C1 > D1 > E1;接着2,3名可以在一场比赛内决出,分别由A2, A3, B1, B2, C1参赛;这样总共进行了5 + 1 + 1 = 7场; 找出前5名的思路和这个类似。
二、
问题:
100亿个整数,内存足够,如何找到中位数?内存不足,如何找到中位数?
参考答案:
内存足够的情况: 可以使⽤用类似quick sort的思想进行,均摊复杂度为O(n),算法思想如下:
• 随机选取一个元素,将比它小的元素放在它左边,比它大的元素放在右边
• 如果它恰好在中位数的位置,那么它就是中位数,可以直接返回
• 如果小于它的数超过一半,那么中位数一定在左半边,递归到左边处理
• 否则,中位数一定在右半边,根据左半边的元素个数计算出中位数是右半边的第几大,然后递归 到右半边处理
内存不⾜足的情况:
方法⼀:⼆分法
思路:一个重要的线索是,这些数都是整数。整数就有范围了,32位系统中就是[-2^32, 2^32- 1], 有了范围我们就可以对这个范围进行二分,然后找有多少个数⼩于Mid,多少数大于mid,然后递归, 和基于quicksort思想的第k大⽅方法类似
方法二:分桶法 思路:化大为小,把所有数划分到各个小区间,把每个数映射到对应的区间⾥里,对每个区间中数的 个数进行计数,数一遍各个区间,看看中位数落在哪个区间,若够小,使⽤用基于内存的算法,否则 继续划分
三、
问题:
引用和指针有什么区别?
参考答案:
本质:引用是别名,指针是地址,具体的:
• 指针可以在运行时改变其所指向的值,引用一旦和某个对象绑定就不再改变
• 从内存上看,指针会分配内存区域,而引用不会,它仅仅是一个别名
• 在参数传递时,引用会做类型检查,而指针不会
• 引用不能为空,指针可以为空
四、
问题:
const和define有什么区别?
参考答案:
本质:define只是字符串替换,const参与编译运行,具体的:
• define不会做类型检查,const拥有类型,会执行相应的类型检查
• define仅仅是宏替换,不占⽤用内存,⽽而const会占用内存
• const内存效率更高,编译器通常将const变量保存在符号表中,而不会分配存储空间,这使得它成 为一个编译期间的常量,没有存储和读取的操作
五、
问题:
define和inline有什么区别?
参考答案:
本质:define只是字符串替换,inline由编译器控制,具体的:
• define只是简单的宏替换,通常会产生二义性;而inline会真正地编译到代码中
• inline函数是否展开由编译器决定,有时候当函数太大时,编译器可能选择不展开相应的函数