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

没想到这篇文章这么受欢迎,那就再分享一篇:苏克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(备注:知乎鹅厂)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 系统下命令 unrar 的英文版使用说明

查看中文版&#xff0c;猛戳《Linux 系统下命令 unrar 的中文版使用说明》 UNRAR 5.40 freeware Copyright (c) 1993-2016 Alexander RoshalUsage: unrar <command> -<switch 1> -<switch N> <archive> <files...> <listfiles...&g…

网络研讨室_免费网络研讨会:Java应用程序中的吞咽异常

网络研讨室1月30日参加我们的网络研讨会&#xff0c;以发现Java应用程序中的“隐藏”异常。 如果一棵树落在森林中&#xff0c;但是没有写到原木上&#xff0c;它会发出声音吗&#xff1f; 答案是肯定的。 这些类型的错误可能会对用户体验造成严重影响&#xff0c;而没有根本原…

java8默认内存收集器_使用正确的垃圾收集器将Java内存使用量降至最低

java8默认内存收集器大小对于软件至关重要。 很明显&#xff0c;与大的整体方法相比&#xff0c;在微服务体系结构中使用小片段具有更多优势。 最新的Java版本的Jigsaw有助于分解旧应用程序或从头开始构建新的云原生应用程序。 这种方法减少了磁盘空间&#xff0c;构建时间和启…

oc 协议 回调 静态成员_每日一问:c++类的成员函数,能作为线程的参数吗?

问&#xff1a;类的成员函数可以传入线程参数吗&#xff1f;回答&#xff1a;如果c语言的全局函数&#xff0c;可以。如果是类的静态成员函数&#xff0c;可以如果是类的普通成员函数&#xff0c;不可以为什么&#xff1f;《深入探索C对象模型》中提到成员函数时&#xff0c;当…

Linux 系统下命令 unrar 的中文版使用说明

查看英文版&#xff0c;猛戳《Linux 系统下命令 unrar 的英文版使用说明》 $ rar --help用法: rar <命令> -<选项 1> -<选项 N> <压缩档案> <文件...> <文件列表...> <解压缩路径\><命令> a 添加文件到压缩档案 …

如何使用 MySQL 安装后自带的帮助文档

文章目录一、查询帮助文档二、MySQL 相关资源网址一、查询帮助文档 输入命令 ? contents 或者 help contents 来显示所有可供查询的分类&#xff1a; mysql> ? contents; You asked for help about help category: "Contents" For more information, type help…

java设置并行度_控制Java并行流的并行度

java设置并行度在掌握了这些新功能之后&#xff0c;随着Java 9的最新发布&#xff0c;我们有了许多新功能可以用来改进我们的解决方案。 Java 9的发布也是修改我们是否掌握Java 8功能的好时机。 在这篇文章中&#xff0c;我想解决关于Java并行流的最常见的误解。 人们通常说您…

flink读取不到文件_日处理数据量超10亿:友信金服基于Flink构建实时用户画像系统的实践...

简介&#xff1a; 友信金服公司推行全域的数据体系战略&#xff0c;通过打通和整合集团各个业务线数据&#xff0c;利用大数据、人工智能等技术构建统一的数据资产&#xff0c;如 ID-Mapping、用户标签等。友信金服用户画像项目正是以此为背景成立&#xff0c;旨在实现“数据驱…

MySQL 如何将数据表中字符串类型的字段值中的部分字符串替换掉(字符串替换/字符串拼接/生成 SQL 脚本语句)

使用拼接函数(concat)生成更新某字段值的 SQL 脚本语句 一、生成更新字段 logo 的 SQL 脚本语句如下: select concat( update tf_company set logo=, replace(logo,http://www.dpqyw.com:80,http://www.dpqyw.com), ,where company_id=,company_id,

apache pulsar_Apache Pulsar:分布式Pub-Sub消息系统

apache pulsarApache Pulsar是一个开源的分布式pub-sub消息传递系统&#xff0c;最初是由Yahoo创建的&#xff0c;并且是Apache Software Foundation的一部分 。 Pulsar是用于服务器到服务器消息传递的多租户高性能解决方案。 脉冲星的主要功能包括[4]&#xff1a; 对Pulsar…

python deque索引超出范围_Python基础语法

学习Python的四个要素有数据&#xff0c;函数&#xff0c;条件循环和模块一、数据数据是Python编程过程中的原材料&#xff0c;通过导入数据&#xff0c;对数据进行操作&#xff0c;实现预先设想的功能。数据共有5种类型&#xff0c;分别是字符串、数字、容器、布尔值和空值。字…

Path环境变量的理解以及设置MinGW环境变量

配置path环境变量 在使用MinGW的时候&#xff0c;不小心把path变量的东西全部删掉了&#xff0c;结果只能自己重新设置path变量&#xff0c;首先要知道如何设置path变量。 Path路径&#xff1a;用来指定可执行文件的搜索路径&#xff0c;也就是后缀名为.exe文件&#xff0c;方…

写java代码时的注意事项_从方法返回Java 8的可选项时的注意事项

写java代码时的注意事项Java 8引入的Optional类一直是该语言版本引入的最具争议的功能之一。 尽管我喜欢这个新的Java类的东西比不喜欢的东西多&#xff0c;但在Java方法中将其用作return类型时&#xff0c;需要考虑一些事情。 我将在本文中讨论其中的一些问题&#xff0c;但不…

Linux 命令之 iconv -- 转换文件的字符编码

文章目录一、命令介绍二、命令语法三、常用选项四、命令示例&#xff08;一&#xff09;对指定文件进行转码&#xff0c;且输出到指定的文件中一、命令介绍 iconv 命令是 Linux 系统自带的用于转换文件编码的命令行工具&#xff0c;iconv 命令用来转换文件的编码方式&#xff…

python asyncio future_Python asyncio.isfuture方法代码示例

本文整理汇总了Python中asyncio.isfuture方法的典型用法代码示例。如果您正苦于以下问题&#xff1a;Python asyncio.isfuture方法的具体用法&#xff1f;Python asyncio.isfuture怎么用&#xff1f;Python asyncio.isfuture使用的例子&#xff1f;那么恭喜您, 这里精选的方法代…

python爬取网站的图片

python爬取网站的图片 本次爬取图片所需要用到的库&#xff1a;Requests库&#xff0c;BeautifulSoup库&#xff0c;正则表达式&#xff0c;os库。 思路&#xff1a;先爬一张图片&#xff0c;再爬一个网站的图片 先爬一张图片&#xff1a; 首先要得到这张图片的地址&#x…

spring 定时器注释_带注释的控制器– Spring Web / Webflux和测试

spring 定时器注释Spring Webflux和Spring Web是两个完全不同的Web堆栈。 但是&#xff0c; Spring Webflux继续支持基于注释的编程模型 使用这两个堆栈定义的端点可能看起来很相似&#xff0c;但是测试这种端点的方式却完全不同&#xff0c;并且编写这种端点的用户必须知道哪…

python计算方位角_实例讲解:用python 计算方位角(根据两点的坐标计算)记得收藏哦...

今天为大家分享一篇python 计算方位角实例(根据两点的坐标计算)&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。一起来看看吧&#xff01;知道两点坐标&#xff0c;怎么计算两点方向的方位角&#xff1f;答&#xff1a;首先计算坐标增量dx&#xff0c;dy(两个…

Java 中的自举类,到底是什么?

欲知详情&#xff0c;猛戳&#xff1a;https://www.zhihu.com/question/447748200

数据库考研SQL操作

SQL的动词 SQL功能动词数据查询SELECT数据定义CREATE, DROP, ALTER数据操纵INSERT, UPDATE, DELETE数据控制GRANT, REVOKE 注&#xff1a;以下[ ]表示方括号的内容可要可不要&#xff0c;|表示或&#xff0c;//表示注释。 一、数据定义 1.CREATE 定义模式 CREATE SCHEMA &…