前言(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%
很简单了 联立连个等式就是了
编程题
- 请在10000个无序数中找到最大的两个数。
我写了下面这个回答;
#coding = utf-8
# please find the max two num from 100000 range 0-10000
import numpy.random as nr
import numpy as np
max = 10 ###use 10 need change to 100000
l = [int(10000*nr.rand(1)[0]) for x in range(max)]
ans = list(np.ones(2)) ## max, max2
for 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] = i
print 'the origin array: ',l
print '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, BinarySerch
public 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');