zoukankan      html  css  js  c++  java
  • 编程面试题

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

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

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

    编程算法题

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

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

     

  • 相关阅读:
    12.3
    团队项目第一阶段冲刺第一天
    4.22
    4.21 re重要功能
    12.1
    12.2
    4.17
    4.16
    css设置子元素相对于父元素保持位置不变(含有滚动条的父元素)
    git操作和npm操作清单
  • 原文地址:https://www.cnblogs.com/xxiaolige/p/9090609.html
Copyright © 2011-2022 走看看