日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2023/12/3 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 腾讯面试编程题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(備注:知乎鵝廠)

總結

以上是生活随笔為你收集整理的腾讯面试编程题python_腾讯面试官出的 2 道经典数据分析面试题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。