一次面试记录

来源:互联网 发布:java messagequeue 编辑:程序博客网 时间:2024/05/17 23:56

前言(Prefore)

找工作的时候因缘巧合面试了一个数据岗, 直接一条龙面试了5轮; 但是最终还是被刷下来了, 但是并不觉得可惜; 原因后面有叙述

过程和背景

首先, 那个公司人事通知我这个面试, 这个面试就是普通的交流群获取的, 时间0425面

0面_笔试 ( 1 h )

数据岗, 考了些数据分析的基础, 概率和数理统计、时间和序列分析、相关决策算法的基础理解和一些简单需求的编程设计

统计学基础

(不知道占多少分, 花了15min的样子)
关于前面的统计学这一块儿, 都是涉及的简单东西,比如F/t 检验的分布, 期望基础题, 移动平滑的意义; 贝叶斯分析的环境等

SQL

问题: 有下面这个表格要求返回每个ID中满足条件的ID,和数量
例如给出下面这个情况; 模拟生成A,B表; creatAB.sql; 后面有,要求编辑 c.sql输出答案。

+--------+-------+-------+-------+-------+| ID     | item1 | item2 | item3 | item4 |+--------+-------+-------+-------+-------+| Zhang3 | ABC   | AA    | BB    | EE    || Li4    | AA    | BB    | DD    | EE    || Wang5  | A     | B     | C     | DD    || Zhao6  | BB    | BCD   | CC    | EE    || Gao7   | A     | AA    | AAA   | AAAA  || Xia8   | AA    | EE    | BB    | C     |+--------+-------+-------+-------+-------+

下面是要求的答案; 在附件中运行 createAB.sql; 运行c.sql即可

####要求输出答案 <-- 添加新列A中字段在B中的数量###+--------+-------+-------+-------+-------+----------+| ID     | item1 | item2 | item3 | item4 | new_line |+--------+-------+-------+-------+-------+----------+| Zhang3 | ABC   | AA    | BB    | EE    |        3 || Li4    | AA    | BB    | DD    | EE    |        4 || Wang5  | A     | B     | C     | DD    |        1 || Zhao6  | BB    | BCD   | CC    | EE    |        3 || Gao7   | A     | AA    | AAA   | AAAA  |        1 || Xia8   | AA    | EE    | BB    | C     |        3 |+--------+-------+-------+-------+-------+----------+

答案: c.sql

drop table if exists c;create table c as(select * from (    select ID,item1 as item from a        union all    select id,item2 as item from a        union all    select id,item3 as item from a        union all    select id,item4 as item from a    ) as c);select A.* ,new_line  from(    (select id,count(id) as new_line from c        where c.item in (select item from b)        group by id) as d        join  A        on A.id = d.id)

这是我写的答案; 不知道怎么, 她不满意; 后来面试还问了一堆外链接内连接, sql函数编写的事儿;她说这个题是用转置来解答的; 我半天没理解, 她还说了我一顿…现在一想什么转置啊, 是联合,肯定是她说错了; 我当时说这个用 pandas 的数据框处理非常简洁。可以自己编译一个函数; 她接着说你难道不会在sql编写函数吗,我无言以对。

基础算法设计

这里就不细致讲了, 非常简单; 就是说设计这样的一个抽奖活动并模拟, 让用户抽奖的钱币回报率大约是4%, 例如10000块的抽奖, 可以抽100次, 每次可以获取200元, 100元, 100-500随机积分(积分没有代价); 百分百中奖, 其中钱币中奖率5%, 但是用户钱币回报率是4%
很简单了 联立连个等式就是了 p1+p2=0.0520p1+10p2=5 ; 再用随机数的 numpy.random.rand() 数值模拟计算就行了, 跳过。

编程题

  1. 请在10000个无序数中找到最大的两个数。
    我写了下面这个回答;
#coding = utf-8# please find the max two num from 100000 range 0-10000import numpy.random as nrimport numpy as npmax = 10 ###use 10 need change to 100000l = [int(10000*nr.rand(1)[0]) for x in range(max)]ans = list(np.ones(2)) ## max, max2for i in l:    if(i < ans[1]):        pass    elif(i>ans[1] and i<ans[0]):        ans[1] = i    else:        ans[1] = ans[0]        ans[0] = iprint 'the origin array: ',lprint 'answer : max and cmax',ans

他问我这个时间复杂度是多少; 我说时间复杂度是 2*n; 也就是二十万。
他说不可能, 就算是快排也得n*log(n),大约八十万的样子; 你怎么可能这么快。非要我用代码实现, 我就给他写了如上。他还是不信。
我说这是个非常简单的题目, 不是盲目快排就好; 快排的第二层循环用得二分查找, 把元素查到排序好的数组中期望是logn, 你让我找到最大的两个数就可以了, 我需要把排好的元素进行遍历比较不; 你要是让我找10个甚至100个最大的数, 我肯定就用快排了。
,快排就是把后面待排的数和排好的作比较, 大的依次后移, 二分查找用在比较这个环节, 不用每次都从尾开始比较;;
后来面试问了几个小问题: 比如set, list, HashMap等的特性.

第二个面试算法题, 网上有, 是他第一次考的, 他没满意问了第二道题(上面的)。
我直接用的

题目:给定一个长度为n+1的int数组,其内元素为1到n,数组中除一个元素外其他元素都只出现一次,求重复出现的元素。要求时间小于O(n^2),空间为O(1)。
实际上他问的没有空间复杂度; 我是直接新建一个同样大的空间遍历的; 他说差评。 好吧; 搜到结果了。

//1, BinarySerchpublic static int findDuplicate(int[] nums) {    if (nums.length == 0 || nums == null)return 0;    int low = 1, high = nums.length - 1, mid;    while (low < high) {        mid = low + (high - low) / 2;        int count = 0;        for (int i = 0; i < nums.length; i++) {            if (nums[i] <= mid)                count++;        }        if (count > mid)            high = mid;        else            low = mid + 1;    }    return low;}//2、通过位操作得到重复的位,把重复的位相加得到结果。public int findDuplicate(int[] nums) {    int n = nums.length-1, res = 0;    for (int p = 0; p < 32; ++ p) {        int bit = (1 << p), a = 0, b = 0;        for (int i = 0; i <= n; ++ i) {            if ((i & bit) > 0) ++a;            if ((nums[i] & bit) > 0) ++b;        }        //b>a说明有重复的位        if (b > a) res += bit;    }    return res;}

第一面 人事大概了解和谈笔试的部分内容

主要问觉得难不难, 以前的工作重点; 最后觉得我的价值观跟他们吻合…扯淡的议一轮

第二面 数据分析部运营部面

主要问得就是对业务的初步了解, 他觉得我可能喜欢技术些; 把我推到了挖掘部

第三面 数据分析部挖掘部面

这个应该是个分析部的研发主管; 问些数据库, 数据结构之类的; 再就是问了些数据比赛的一些经历和算法

第四面 直接主管

对我的作答进行说明; 另外额外问了些问题;

其他略


后记

笔试 – > 人事面 –>数据部(分三个部分) 数据部运营问(需求方) –> 数据部挖掘部 —> 研发总管 —-> 直系主管 —> 总监。
直系主管问得多些, 其他人问得都是不痛不痒的。
为什么说不可惜呢。 因为笔试的时候, 不能上机, 放在一个小屋子里面让我做题; 用户体验比较差了; 明显是编程题, 你不让人上机; 怎么都能写得完整…

附录

SQL 题目文件

creatAB.sql

create database ab;use ab;drop table if exists A;create table A(    ID  char(8),    item1 varchar(8),    item2 varchar(8),    item3 varchar(8),    item4 varchar(9));insert into A values('Zhang3','ABC','AA','BB','EE');insert into A values('Li4','AA','BB','DD','EE');insert into A values('Wang5','A', 'B','C','DD');insert into A values('Zhao6','BB','BCD','CC','EE');insert into A values('Gao7','A','AA','AAA','AAAA');insert into A values('Xia8','AA','EE','BB','C');drop table if exists B;create table B(  item  varchar(8) );insert into B values('AA');insert into B values('BB');insert into B values('CC');insert into B values('DD');insert into B values('EE');
1 0
原创粉丝点击