常见面试题

一、

问题:

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函数是否展开由编译器决定,有时候当函数太大时,编译器可能选择不展开相应的函数

posted on 2015-09-10 14:33  冰雨纷飞  阅读(152)  评论(0编辑  收藏  举报

导航