面试真是痛并快乐的一件事,痛在被虐的体无完肤,快乐在可以短时间内积累很多问题,加速学习。
下面是我这个三旬小老汉人生第一波面试时遭遇的面试题,编程部分在此,因为我面试的大多数是机器学习算法岗,对编程的要求不算很高,此处简要记录一下。
面试题还有两部分,是 机器学习算法面试题 和 大数据技术。
编程算法题
1、输出给定数组的全排序。
这个算法题很经典,融合了循环(loop)、递归(recursive)和交换(swap),样例很多,百度可查,附一个比较靠谱的帖子:全排列-递归算法
2、N*N二维数组,行和列都是升序排列,查找某个数字K是否存在?
第2、3两题是硅谷前辈给我出的,他们是我T大的学长,在他们的提示下,我算是勉强做出来了。
第2题的矩阵,举个例子:如何利用程序判断下面这个5*5的矩阵里是否存在10这个数字?
1,2,3,4,5
2,4,4,5,6
3,4,6,7,8
4,5,6,8,9
6,6,8,9,11
(1)最笨的办法:从左到右,从上到下,逐行逐列扫描,时间复杂度O(N2);
(2)改进是方法:从对角线入手,先在对角线上找到最后一个不大于K的元素,这样可以去掉该元素左上角的全部元素,相当于去掉了一个子矩阵,然后在剩余的元素里做行列遍历,时间复杂度是O(NlogN)(没有严格验证,似乎是这样);
(3)更好的方法:把最笨的方法对称过来,从右至左,从上到下的搜索,类似于走迷宫,如果a[i][j]<K,就向下移动 j++,如果a[i][j]>K就向左移动 i--,直到找到K 或者i,j达到极值(也就是没有找到K),时间复杂度是O(N)。
代码时间比较简单,都写在上面了,就不附代码了。
3、给定数组a,判断a中是否存在两个数字,相加等于10?
这个题是典型的难者不会,会者不难。我毫无疑问是前者,所以还是从最笨的方法入手。
(1)最笨的方法:二重遍历,判断是否有两个数字相加等于10,时间复杂度O(N2);
(2)改进的方法:核心思想是把比10小的所有数值是否存在、存在几个记录下来,然后再做判断。操作过程是:遍历一遍数组,记录下每个数值出现的次数,比如 count[0]=1,count[1]=1,count[2]=3,...,count[9]=2,count[10]=0,然后遍历这个count数组,如果 count[i]和count[10-i]都大于0,说明存在相加等于10的两个数字(数字5需要做出现两次才可以),时间复杂度O(N)。
4、二叉搜索树,寻找排在第N大的数字是多少?
面试前匆匆复习了二叉树,到了面试时,完全懵圈,没反应过来,其实这个就是二叉搜索树的中序遍历。
Linux脚本题
1、输出一个文件的行数?
用wc命令直接搞定, wc -l [filepath]
2、从某个文件夹的全部文件中找出包含特定字符串的行,输出这些行及其前后的若干行?
带参数的grep命令可以搞定,
cat [filepath] | grep 'abc' -A 4 -B 2 , -A 4
表示输出abc所在的行及之后的4行,-B 2 表示输出abc所在的行及之前的2行。
SQL题
1、寻找table中某一列的所有波峰和波谷?
比如,有一个table记录了某只股票价格的时间序列:
id price time
1 12.1 09:30
2 12.4 09:31
3 12.3 09:32
...
60 12.7 10:30
如何利用SQL语句查询出price价格的所有波峰和波谷? 波峰指的是t时刻的价格比t-1和t+1时刻都高,波谷指的是t时刻的价格比t-1和t+1时刻都低。
这个题目是在考察数据库的join操作,表自身与自身做 innerjoin 即可解决,。
波峰的查询语句是:
select a.id,a.price,a.times from stock as a inner join stock as b on a.id=b.id+1 inner join stock as c on a.id=c.id-1 where a.price>b.price and a.price>c.price;
波谷的查询语句是:
select a.id,a.price,a.times from stock as a inner join stock as b on a.id=b.id+1 inner join stock as c on a.id=c.id-1 where a.price<b.price and a.price<c.price;
顺着这个例子可以复习一下数据库的 innerjoin leftjoin rightjoin outerjoin 操作,画两个圈圈,涂黑不同的区域,写出对应的join语句。(参考示例)
2、找出每个班级排名前三的学生?
比如,有一个table记录了若干个班级的若干名学生的考试成绩:
id class name score
1 01 a1 90
2 01 a2 89
3 01 a3 66
4 02 b1 91
5 03 c1 88
...
用SQL语句找出每个班级成绩前三名的学生?
我面试时给出的答案是:
select top 3 max(score),name from table group by class
逻辑似乎是对的,面试官唯一提出的疑问是 top 这个写法他不了解,他说他平时用oracle,oracle里没有top这个关键字。我没用过oracle,无力反驳,只好告诉他,mysql语句是有top关键字的,他不置可否,气氛有点尴尬。。。
编程算法题目遇到的不算多,也不算深,就先记录到这里吧。