在牛客网找了阿里的内推,很快就接到了笔试通知,笔试一个小时两道编程题,我都没做出来,以为肯定挂了,没想到几天后竟然收到一个面试通知。面试的时候和对方聊了很久,收获很大,从中也发现了自己很多的不足指出。
面试官一上来就开始出题,用的阿里在线测评系统,可以直接看到我这边的操作步骤,面试官询问了我擅长什么语言,我说SQL和python,然后出了两道SQL题和一道Python题。
第一道SQL题是:假设有表a,其中有三个字段,分别为subject_id(科目id), user_id(学生id), score(分数) 注: 同一个学生在多个科目下有分数,用sql找出每个科目下分数前10的学生id、分数、该科目平均分
我的答案:用了一个with虚表求出每个科目的平均分,然后用一个窗口函数row_number得到每个科目中学生的排序,然后取前10
with avg_score as (
select subject_id,
avg(score) as avg_score
from a
group by subject_id
)
select subject_id, user_id,score,
row_number (partition by subject_id order by score desc) rank,
b.avg_score
from a
left join avg_score b on (a.subject_id = b.subject_id)
where rank <=10
第二道SQL题是:三个表 a、b、c,每个表都有一个字段名称为 id 的字段,写一个sql查找出:三个表中每个表独有的id(三个集合的并集减去两两的交集)
我的答案:利用外连接分别得出三张表唯一的id,然后将这些id连接起来
select a.id
form a
left join b on (a.id = b.id)
left join c on (a.id = c.id)
where b.id is null and c.id is null
union all
select b.id
form b
left join a on (a.id = b.id)
left join c on (b.id = c.id)
where a.id is null and c.id is null
union all
select c.id
form c
left join a on (a.id = c.id)
left join b on (b.id = c.id)
where a.id is null and b.id is null
这两道还算在比较短的时间里做对了,然后面试官又在第二道题中延申深问了我一个问题,如果b表加一个字段is_valid,将b.is_valid='Y'放入连接条件on后面和where后面是否存在不同。我刚开始蒙了一下,后面认真思考了一下发现还是有很大不同的。
select a.id
form a
left join b on (a.id = b.id and b.is_valid='Y')
left join c on (a.id = c.id)
where b.is_valid='Y'
第三道python题如下: 输入一个字段串,判断是否符合员工生命周期(需要满足,先入职,再离职,并且晋升/转岗行为只能发生在在职状态)
例如:
1. String str="入职" 返回true
2. String str="入职 晋升 转岗" 返回 true
3. String str="入职 晋升 转岗 离职" 返回true
4. String str="入职 晋升 离职 入职 离职" 返回true
5. String str="入职 转岗 入职" 返回false
6. String str="入职 转岗 离职 晋升 入职" 返回false
7. String str="入职 离职 离职" 返回fasle
8. String str="晋升 转岗 离职" 返回false
……
这道题,我没有在规定时间内做出来,但跟面试官说了一下思路,就是要把输入的字符串先拆开,然后分别去判断每个状态是否合法。
做完题目之后,和面试官主要聊了一下自己的实习经历以及校园经历,面试官还问了两个开放性问题,一个是如何评估上海市有多少个餐馆?还有一个是如何帮助美团等生活类app比较高效率地找到附近离你最近地餐馆?没有固定答案,主要考察一下个人的分析问题能力。然后还问了一些常见数据结构的使用场景和原理。
最后面试官我有没有什么问题,我问了一下对方对招暑期实习生有什么要求,对方答:“基础扎实,比较聪明,学校会实习有比较好的经历”。