编程面试题

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

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

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

编程算法题

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 -l [filepath]

2、从某个文件夹的全部文件中找出包含特定字符串的行,输出这些行以及这些行前后的若干行?

带参数的grep命令,cat [filepath] | grep 'abc' -A 4 -B 2 , -A 4 表示输出abc所在的行及之后的4行,-B 2 表示输出abc所在的行及之前的2行。

====未完待续====

SQL题

1、寻找波峰和波谷?

 

2、找出每个班级排名前三的学生?

 

猜你喜欢

转载自www.cnblogs.com/xxiaolige/p/9090609.html