编程面试题

面试真是痛并快乐的一件事,痛在被虐的体无完肤,快乐在可以短时间内积累很多问题,加速学习。

下面是我这个三旬小老汉人生第一波面试时遭遇的面试题,编程部分在此,因为我面试的大多数是机器学习算法岗,对编程的要求不算很高,此处简要记录一下。

面试题还有两部分,是 机器学习算法面试题 和 大数据技术。

编程算法题

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关键字的,他不置可否,气氛有点尴尬。。。

编程算法题目遇到的不算多,也不算深,就先记录到这里吧。

 

原文地址:https://www.cnblogs.com/xxiaolige/p/9090609.html