没想到这篇文章这么受欢迎,那就再分享一篇:苏克1900:腾讯高级数据分析师:十年分析之路的力荐书籍​zhuanlan.zhihu.com

以下原文章:

近期暑期实习和提前批招聘已经开始了,不论你是校招还是想社招,肯定是要刷很多题才行,如果你想投鹅厂的数据分析师岗位,强烈建议看下下面两道面试题,是鹅厂资深数据分析面试官(annatx)出的特别好用的硬性技能考察题目。

做实战题目是王道,刷一道顶得上在网上刷百道。

面试都有固定的流程,通常是自我介绍,硬性技能考察,项目经历追问和Q&A环节。

之所以把硬性技能考察紧跟自我介绍后面,是因为不管简历包装的有多好,招来的小伙伴始终要能get hands dirty,如果一些必须的技能不ok,那就没啥给机会的必要了。我们团队这边比较关注的还是SQL和Python技能,所以但凡学生声称自己熟练掌握SQL和Python的,都会详细考察一下实际能力。所以两道题目,一道是SQL题,一道是Python题。

SQL题目

这道题目还挺舍不得分享出来的,不过我自己用下来是真的觉得堪称SQL试金石。不仅是校招生,就算是写了好多年SQL的人,也不一定真的能快速想出来答案,但被告知答案了又会觉得真的其实蛮简单的。因为题目都是我工作时候遇到觉得很有趣记录下来的case,所以可能是百度orGoogle也搜不出来的珍藏私货。

题目:有一张用户签到表【t_user_attendence】,标记每天用户是否签到(说明:该表包含所有用户所有工作日的出勤记录) ,包含三个字段:日期【fdate】,用户id【fuser_id】,用户当天是否签到【fis_sign_in:0否1是】;

问题1:请计算截至当前每个用户已经连续签到的天数(输出表仅包含当天签到的所有用户,计算其连续签到天数)

输出表【t_user_consecutive_days】:用户id【fuser_id】,用户联系签到天数【fconsecutive_days】

解答逻辑非常简单,只需要用max和datediff。实际答案就留在文末好了。

问题2:请计算每个用户历史以来最大的连续签到天数(输出表为用户签到表中所有出现过的用户,计算其历史最大连续签到天数)

输出表【t_user_max_days】:用户id【fuser_id】,用户最大连续签到天数【fmax_days】

这个乍看不太是SQL能解决的问题,但仔细想想就有思路。我的答案可能也不是最佳答案,但暂时还没问到过别的答案吧。

Python题目

题目:针对股票的最大回撤率指标定义,给出代码实现思路。给定的是产品所有交易日的净值序列,且其净值序列已按照日期排序。

最大回撤率:在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。

追问:如何在提升计算效率?

这道题类似的题目其实在leecode也有,这个大概是变化但类似版本(可以搜leecode股票最大回报);因为团队里处理比较多金融资产数据,这个指标是策略中最常见的指标之一,所以也是一道工作中攒下来的题目。这个指标的计算优化问题真的非常值得问,我后面会列几个版本的代码思路和实现代码。

通常最简单的计算实现,会需要O(n2)的计算复杂度;可以针对如何降低计算复杂度,专门追问。

漫谈

其实这俩题目,核心考察的都不是语言能力,因为语言永远都在更新,始终可以通过写得多来提升熟悉度;核心考察的其实都是逻辑和算法能力,就算忘记核心函数或者语法,回归到问题本身,有逻辑的candidate还是能给出思路和步骤,那当然如果语法和函数都非常熟悉,那就更完美了,可以马上写出来答案。

其他经验

很多硬性技能考察题,核心一样,题面可以一直换,比如:签到可以变成用户活跃,用户充值次数之类的,可以换成候选人项目经历里熟悉的context,有些候选人比较紧张,换点熟悉的场景,似乎就脑子转的快一点。如果候选人最简单的版本能快速给出思路,可以一层层追问,了解ta的思考过程,更全面考察逻辑能力。

参考解答

感觉要是不给参考答案的话,分享题目还是有点耍流氓的意思,就还是给几个答案参考参考。

SQL题目:

问题1答案:

思路:先找用户最近一次未签到日期,再用今天减那个日期

create table t_user_consecutive_days as

select fuser_id

,datediff('20200322',fdate_max) fconsecutive_days

from

(select fuser_id

,max(fdate) fdate_max

from t_user_attendence

where fis_sign_in = 0

group by fuser_id

) t1

;

问题2答案:把用户所有签到记录转化成一条0-1字符串序列,用0做split切割,计算切出来的1序列组中的最大长度

create table t_user_max_days as

select fuser_id

,max(length(cut_fsign_record)) as fmax_days

(select fuser_id

,fsign_record

,cut_fsign_record

from

(select fuser_id

,wm_concat(fis_sign_in) fsign_record

from t_user_attendence

group by fuser_id

) t1

lateral view explode(split(fsign_record,'0')) t as cut_fsign_record

) t2

where cut_fsign_record<>''

group by fuser_id

;

Python题目:

最大回撤率:输入参数都是按照日期降序排列的净值序列

基础实现版本:

def max_drawdown(accnavArr):

mdd = 0

for i in range(0, len(accnavArr)):

for j in range(i + 1, len(accnavArr)):

drawdown = accnavArr[i] / accnavArr[j] - 1

if drawdown < mdd:

mdd = drawdown

return mdd

空间换时间实现版本:

把每个时间点计算的最大值都存到一个列表结构中,最大回撤的计算只需要再依赖这个列表进行多一次循环计算。

def maxDrawdownGainCal(accnavArr): # 默认accnavArr按日期降序排列

maxDrawdown = 10000

maxGain =0

arr_len = len(accnavArr)

maxList = [0.0] * arr_len

minList = [0.0] * arr_len

maxList[arr_len-1] = accnavArr[arr_len-1]

minList[arr_len-1] = accnavArr[arr_len-1]

for i in range(arr_len-2,-1,-1):

if accnavArr[i] > maxList[i+1]:

maxList[i] = accnavArr[i]

else:

maxList[i] = maxList[i+1]

if accnavArr[i] < minList[i+1]:

minList[i] = accnavArr[i]

else:

minList[i] = minList[i+1]

for i in range(0,arr_len):

mdd = (accnavArr[i]/maxList[i]-1)

mg = (accnavArr[i]/minList[i]-1)

if mdd < maxDrawdown : maxDrawdown = mdd

if mg > maxGain : maxGain = mg

return maxDrawdown,maxGain

当前最优版本:

每个时间点同时更新最大值和最大回撤,两个指标,不需要额外空间,且只做一次列表循环计算。

def maxDrawdownGainCal(accnavArr): # 默认accnavArr按日期降序排列

maxDrawdown = 10000

maxGain =0

arrLen = len(accnavArr)

startMdd = accnavArr[arrLen-1]

startGain = accnavArr[arrLen-1]

for i in range(arrLen-2,-1,-1):

if accnavArr[i] > startMdd:

startMdd = accnavArr[i]

mdd = (accnavArr[i]/startMdd-1)

if accnavArr[i] < startGain:

startGain = accnavArr[i]

mg = (accnavArr[i]/startGain-1)

if mdd < maxDrawdown : maxDrawdown = mdd

if mg > maxGain : maxGain = mg

return maxDrawdown,maxGain

更多干货,欢迎关注我的公众号:高级农民工。鹅厂内推可以加我wx:ninteen__1900(备注:知乎鹅厂)

腾讯面试编程题python_腾讯面试官出的 2 道经典数据分析面试题相关推荐

  1. java校招面试题_java校招面试编程题及答案.docx

    java校招面试编程题及答案 java校招面试编程题及答案 Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点.这里,我列出了一些关于Java集合的重要问题和答案. 集合框 ...

  2. c语言面试编程笔试题,C语言面试编程题

    C语言面试编程题 发布时间:2021-04-10 在C语言中,输入和输出是经由标准库中的一组函数来实现的.在ANSI/ISO C中,这些函数被定义在头文件;中.下面就由第一范文网小编为大家介绍一下C语 ...

  3. 面试编程题胡萝卜切片

    面试编程题胡萝卜切片 记录一下python实现 class Solution:def last_carrot_weight(self, carrots: list):while True:a=[]fo ...

  4. 最全技术面试180题:阿里11面试+网易+百度+美团!

    最全技术面试180题:阿里11面试+网易+百度+美团! 网络编程 ISO模型与协议 http1.0:需要使用keep-alive参数来告知服务器端要建立一个长连接 http1.1:默认长连接.支持只发 ...

  5. 2022华为Android面试真题,腾讯安卓面试

    一.java相关 java基础 1.java 中==和 equals 和 hashCode 的区 <Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义> An ...

  6. 最新Java面试300题:腾讯T4面试+美团+京东+拼多多(文末答案附赠)

    数据库原理 MYISAM与innodb搜索引擎原理MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.其采用索引文件与数据文件,索引文件只存放索引,叶子节点存放数据 ...

  7. 【面试真题】腾讯2018秋招前端正式试题(含答案)

    参考答案关注公众号,回复"腾讯答案"获取 01 不定向多选 1.    往下面的5阶B树中插入关键吗80后,该B树第二层的节点数为( ). A.   6 B.   7 C.   8 ...

  8. 小米一面经验分享,面试编程题

    第一次面试大厂,其实挺紧张的. 本人应届生,面试岗位是小米的嵌入式工程师 一面是技术基础面流程:自我介绍 - 面试官自我介绍 - 根据简历内容提问 - 手撕代码 面试官人很好,每次提问之后,都会再阐述 ...

  9. 《面试》 --阿里巴巴数据分析岗面试编程题解析

    昨天做阿里非研发岗编程题,虽不是很难,但还是因为个人原因调试失败,特此今日复盘,希望能帮助大家提高. 第一题 选择出行方式,ofo是每1.5公里1元,不足1.5公里的按1.5计算 永安行是使用时间,每 ...

最新文章

  1. 两个程序员的泰国普吉岛之行
  2. R语言可视化分面图、假设检验分组t检验、可视化单变量分组分面箱图(faceting bar plot)、添加误差条(error bar)、添加p值、添加抖动数据点(jitter points)
  3. Cassandra HBase和MongoDb性能比较
  4. python 编程该看那些书籍_初学者自学Python要看什么书?
  5. 骁龙660_高通骁龙660可以带动6g运行内存吗?
  6. CString,string,char*,比较
  7. RK3399封装(CPU+GPU)Mali-T860 Codec架构(十六)
  8. go语言strings包
  9. 打造物联网+WiFi融合新模式 华三通信发布卫星AP
  10. my sql实验视图_数据库SQL 视图的创建及使用实验报告(共5篇)
  11. 东数西算背后的大棋局
  12. 如意淘商品推荐技术介绍之一:基础推荐
  13. linux缺省的shell,Linux操作系统缺省的shell
  14. 和林格尔新区打造先进算力的“蓄水池”
  15. 可靠传输的实现机制——回退N帧协议GBN(Go Back N)
  16. C++的errorC2039和C2679的解决
  17. 发票扫描识别 发票ocr识别
  18. 8家公司笔面试经历-百度-联发科-瑞晟--
  19. Excel 中的查找替换功能
  20. python爬虫反爬-爬虫怎么测试反爬?

热门文章

  1. 接口中默认方法和静态方法_接口中的默认方法和静态方法
  2. 子模板继承父模板示例_模板设计模式示例
  3. java 性能调优_Java性能调优调查结果(第四部分)
  4. 具有InlfuxDB的Spring Boot和Micrometer第3部分:Servlet和JDBC
  5. mongodb连接java_如何从Java EE无状态应用程序连接到MongoDB
  6. Java 8 Stream示例
  7. 与时俱进:在JAX-RS API中采用OpenAPI v3.0.0
  8. jta atomikos_带有Atomikos示例的Tomcat中的Spring JTA多个资源事务
  9. 切换表达式到Java吗?
  10. 用杰克逊流式传输大型JSON文件– RxJava常见问题解答