为了OFFER系列 | 牛客网美团点评数据分析刷题
@Author:Runsen
對于大學的每一個階段,都有著不同的意義,在大學期間一定要有明確的戰略、打法,以及人生布局,才能最大程度的提升自己,才能在未來走的更遠。
現如今大四,為了OFFER,沖啊
下面題目都是來自美團點評的2020春招的數據分析原題。
文章目錄
- 1、數據分析思維
- 2、數據庫
- 3、數學題
- 4、編程題
- 5、編程題
- 6、編程題
- 7、關聯查詢
- 8、編程題
- 9、編程題
- 10、編程題
1、數據分析思維
廣告是互聯網企業重要的變現模式,在美團的廣告業務中,商家會和美團的銷售簽訂不同類型的廣告合同(比如,按點擊收費的廣告cpc、按曝光收費的廣告cpm、按時長收費的廣告cpt)。美團會為商家創建相關的廣告內容素材創意(比如,門店圖片、活動圖片、促銷文字等),并通過美團的廣告引擎,根據用戶訪問的行為特征,基于算法策略將商家的廣告內容投放到美團的app或者外部合作伙伴(比如如:騰訊,頭條)的app不同的展示位置上。普通用戶訪問這些廣告后,會對商家產生興趣,可能產生購買轉換行為,美團會和商家做廣告的計費結算,同時為商戶提供用戶的廣告效果信息(比如:廣告帶來的門店訪問量、訂單數等)。
1、 如果讓你對這個業務進行抽象,你會抽象出哪些數據分析主題,并說出你這樣分的原因;
2、 請你根據問題1抽象的主題,進行主題模型設計,并說明設計的模型內容,以及模型之間的關系。
1、 廣告素材特點和用戶訪問量的主題:用來分析不同特點和素材的廣告對吸引用戶訪問是否有較大的關系。 用戶訪問行為特征和最終購買行為主題:分析用戶在廣告頁面滑動、點擊、停留等特征,是否對最終購買行為有較大的關系。 收費模式、商戶類型、商戶付費的關系:分析不同類型的商戶在不同模式下的付費意愿,用于向未使用廣告業務的商戶推廣 投放時段和訪問量訂單數的關系:能帶來高訪問量或訂單數的投放時段,價格可以適當調整 不同類型商戶廣告投放的效果分析:分析哪些類型商戶廣告投放效果較差,可以幫助商戶調整引流策略2、 用戶訪問行為特征和最終購買行為主題:特征值可以選擇用戶點擊進入廣告后的行為特征,包括滑動速度、滑動方向、停留時間、點擊等。 結合最終購買行為,用來分析用戶行為特征對購買行為的影響。可以實時預測用戶行為是否有較大幾率產生購買行為。對購買意愿弱的用戶,可以在頁面中實施其他推廣營銷策略,加強用戶的購買意愿。2、數據庫
說明關系型數據庫通過索引提升查詢效率的背后原理 。
1. 如果沒有索引,數據庫引擎需要通過全表掃描來查找數據,這會產生大量的磁盤IO。2. 關系型數據庫使用B+樹構建索引來加速加快查詢。B+樹是一種二叉查找樹(每個節點的鍵值必須:比保存在左子樹的任何鍵值都要大,比保存在右子樹的任何鍵值都要小),這樣隨機查找某個鍵值時可以通過從根節點執行二叉查找來加速查詢,查詢成本取決于樹的層數。3. 針對范圍查詢和排序的優化:在每個葉子節點保存其下一個葉子節點的指針,這樣當指定范圍范圍查詢時,先從根節點根據范圍的左值找到其葉子節點,之后通過向后遍歷葉子節點即可找到對應范圍右值,這樣可以加速范圍查詢、排序、分組等數據庫查詢動作。4. 針對磁盤讀寫速度的優化:除了葉子節點之外的其他節點只保存鍵值,這樣對磁盤的單次讀寫可以獲取到盡可能多的數據。以MySQL為例,一個1000萬行的表對應的B+樹按照主鍵查找理論上只需要3次磁盤IO,這相對于全表掃描帶來的磁盤IO是多個量級的性能提升。5. MySQL等數據庫引擎在實際實現B+樹索引的時候,針對磁盤讀寫做了優化:非葉子節點中只存放key值,葉子節點中除了key值也會存放數據,按照存放數據的不同索引區分為主索引(聚簇索引)和輔助索引:a) 主索引的葉子節點中存放該key值對應的完整記錄,使用主索引進行查找時,可以直接輸出記錄;一個表只能創建一個主索引。b) 普通索引的葉子節點則存放對應主鍵的值,因此在使用輔助索引進行查找時,需要先查找到主鍵值,然后再到主索引中進行查找;一個表可以創建多個輔助索引。6. 除了B+樹,關系型數據庫一般也支持哈希索引,哈希索引能夠非常高效地進行隨機查找,但是對于范圍查詢、排序和分組都不支持。3、數學題
【污水處理問題】一家污水處理廠通過去掉污水中有害的污物來凈化水質,生產出用于灌溉使用的水源。該處理過程每小時可以去掉處理池中剩余污物的12%。
問:1.一天后處理池中將大概處理掉百分之幾的污物?
2.要多長時間才能把污物的量減少一半?
設:初始污物量=a0a_0a0?、處理x小時后的污物量=axa_xax?
于是得到污水處理模型:ax+1=ax?ax?12%=0.88axa_x+1=a_x-a_x*12\%=0.88a_xax?+1=ax??ax??12%=0.88ax?,轉化為基礎表達式為ax=(0.88)?a0a_x=(0.88) * a_0ax?=(0.88)?a0?,其中x為污水處理的小時數
一天為24小時,即a24=(0.88)24?a0≈0.0465?a0a_{24}=(0.88)^{24}*a_0≈0.0465*a_0a24?=(0.88)24?a0?≈0.0465?a0?,即一天后大于處理掉95.35%的污物;
處理掉一半,即ax=0.5?a0a_x=0.5*a_0ax?=0.5?a0?,0.5=(0.88)x0.5=(0.88)^x0.5=(0.88)x,x=log0.5/log0.88≈5.42x=log0.5/log0.88≈5.42x=log0.5/log0.88≈5.42小時;
4、編程題
在4*4的棋盤上擺滿了黑白棋子,黑白兩色的位置和數目隨機其中左上角坐標為(1,1),右下角坐標為(4,4),現在依次有一些翻轉操作,要對一些給定支點坐標為中心的上下左右四個棋子的顏色進行翻轉,請計算出翻轉后的棋盤顏色。
(1)輸入描述:
給定兩個數組,分兩行
第一行為分別為初始棋盤,為4?44?44?4矩陣,其中0表示白色棋子,1表示黑色棋子
第二行為翻轉位置,其中翻轉位置共有3個
(2)輸出描述:請返回翻轉后的棋盤,為4?44?44?4矩陣
(3)輸入例子:
(4)輸出例子:
[[0,1,1,1],[0,0,1,0],[0,1,1,0],[0,0,1,0]]思路: 將支點的前后左右都進行翻轉,需要明確支點的位置,就是對支點的位置進行判斷,如果存在就翻轉,這里的翻轉可以直接用1-color,具體代碼如下所示。
''' @Author: Runsen @微信公眾號: 潤森筆記 @博客: https://blog.csdn.net/weixin_44510615 @Date: 2020/8/30 ''' # 將支點的前后左右都進行翻轉,但是需要明確支點的位置 def doFilp(array,position):for x, y in position:# 對index進行減一操作x -=1y -=1# 支點左邊還有棋子,那么就進行翻轉if x > 0:array[x-1][y] = 1-array[x-1][y]# 支點右邊還有棋子,那么就進行翻轉if x < 3:array[x+1][y] = 1- array[x+1][y]# 支點下邊還有棋子,那么就進行翻轉if y > 0:array[x][y-1] = 1 - array[x ][y-1]# 支點上邊還有棋子,那么就進行翻轉if y < 3:array[x][y+1] = 1 - array[x ][y+1]return arrayif __name__ == '__main__':array = eval(input())position = eval(input())print(doFilp(array,position))# 測試成功 [[0,0,1,1],[1,0,1,0],[0,1,1,0],[0,0,1,0]] [[2,2],[3,3],[4,4]] [[0, 1, 1, 1], [0, 0, 1, 0], [0, 1, 1, 0], [0, 0, 1, 0]]5、編程題
尋找最后的山峰。山峰元素是指其值大于或等于左右相鄰值的元素。給定一個輸入數組numsnumsnums,任意兩個相鄰元素值不相等,數組可能包含多個山峰。找到索引最大的那個山峰元素并返回其索引。 假設 nums[?1]=nums[n]=?∞nums[-1] = nums[n] = -∞nums[?1]=nums[n]=?∞。
(1)輸入描述:在命令行中輸入一行數字,數字之間以空格分割,遇到換行符結束。輸入的數字為整型,且總數量在10萬以內。
(2)輸出描述:輸出索引最大的山峰的索引值(一個數字)
(3)輸入例子:2 4 1 2 7 8 4
(4)輸出例子:5
6、編程題
‘
給定一個整數數組,返回一個數組。該返回數組中第i個數字為,原數組中第i個位置的數字至少往右走多少步才能遇到比它大的數字。如果遇不到或者已經處于最右的位置,則置為-1。
輸入描述::輸入為多行,第一行為一個整數N,1≤N≤106
接下來一共有N行,每一行為一個整數M,0≤M≤232-1
輸出描述::輸出 N 行,每行一個數字表示轉換之后的數組
輸入例子1:
5 91 10 3 22 40輸出例子1:
-1 2 1 1 -1思路:棧方法
''' @Author: Runsen @WeChat:RunsenLiu @微信公眾號: Python之王 @CSDN: https://blog.csdn.net/weixin_44510615 @Github: https://github.com/MaoliRUNsen @Date: 2020/8/31 ''' def solution(nums):result = [-1] * Nstack = []# 倒序遍歷for i in range(N - 1, -1, -1):# stack存放著倒序的index。然后用對應的index相減# 判斷棧是否為空和 nums中的前面的數字是不是比后面的大while len(stack) > 0 and nums[i] >= nums[stack[-1]]:stack.pop()# stack最后一個就是 i 變大的indexif len(stack) > 0:result[i] = stack[-1] - ielse:# 不存在說明后面沒有比i 大的數result[i] = -1stack.append(i)return result if __name__ == '__main__':N = int(input())nums = [int(input().strip()) for _ in range(N)]result = solution(nums)for i in result:print(i)7、關聯查詢
數據對象data1List,員工表,存儲員工ID,員工姓名
數據對象data2List, 員工工作時長表,存儲員工ID,月份,工時
計算每個員工1-3月每月工時及總工時
輸入描述:
員工ID 員工姓名員工ID 月份 工時 月份 工時 月份 工時輸出描述:
員工姓名 空格 一月份工時 空格 二月份工時 空格 三月份工時 空格 總工時輸入例子1:
zhangwei01 01 200 02 150 03 196輸出例子1:
zhangwei01 200 150 196 546難度簡單。不說了,就是送分。
data1List=input().strip().split(" ") data2List=input().strip().split(" ") print(data1List[1]+" "+data2List[2]+" "+data2List[4]+" "+data2List[6]+" "+str(int(data2List[2])+int(data2List[4])+int(data2List[6])))8、編程題
在實時計算中,數據流源源不斷地流入計算單元,經常需要借助窗口來處理數據,其中有一類窗口為滑動窗口(Sliding Window),其特點是窗口長度固定,每次滑動一定的位移(slide)
現給定一個數組 nums,有一個長度為 k 的滑動窗口從數組的最左側移動到數組的最右側。注意你只可以看到在滑動窗口 k 內的數字,滑動位移大小slide=1,即滑動窗口每次只向右移動一位。
要求返回每一個滑動窗口內的中位數,解釋中位數定義,例如:對于[2,3,4],中位數是3;對于[2,3],中位數是 (2 + 3) / 2 = 2.5
注意:為了簡化窗口計算,規定如果沒有累計到窗口大小的數,不能觸發計算,即不輸出結果!
輸入描述:
輸入兩個數字n,k。n表示數組長度,k表示窗口大小
加下來n個整數用空格隔開,表示nums數組
(1<=k<=n)(1<=n<=1000)輸出描述:
輸出若干個數字,表示滑窗依次移動得到的結果,保留小數點后一位數字
輸入 8 3 1 3 -1 -3 5 3 6 7 輸出 1.0 -1.0 -1.0 3.0 5.0 6.0說明
''' @Author: Runsen @WeChat:RunsenLiu @微信公眾號: Python之王 @CSDN: https://blog.csdn.net/weixin_44510615 @Github: https://github.com/MaoliRUNsen @Date: 2020/8/31 ''' n,k = map(int,input().strip().split()) nums = list(map(float,input().strip().split())) res = [] mid = k // 2 # 滑動窗口的次數 for i in range(len(nums)-k+1):cur = sorted(nums[i:i+k])# 奇數if k % 2 != 0:res.append(round(cur[mid],2))else:res.append(round((cur[mid] + cur[mid-1]) / 2,2)) res = [str(i) for i in res] print(' '.join(res))9、編程題
輸入年份月份,請輸出這個月的天數
輸入描述:多組輸入輸出
第一個參數為年份,如2018代表2018年,2019代表2019年
第二個參數為月份,如1代表1月,2代表2月
輸出描述:輸出當月的實際天數。
示例1 輸入 2018 2 2020 2 2019 1 輸出 28 29 31難度簡單。不說了,就是送分。
def solution(a,b):if b != 2:if b in [1,3,5,7,8,10,12]:return 31else:return 30else:# 判斷是不是閏年if a % 100 != 0 and a % 4 ==0:return 29elif a % 400 == 0:return 29else:return 28while True:try:year, month = map(lambda x:int(x),input().split(' '))print(solution(year, month))except:break10、編程題
整數分解:一個正整數N可以分解為M(M>1)M(M>1)M(M>1)個正整數的和,即N=K+LN=K+LN=K+L,例如N=5N=5N=5、M=2M=2M=2時可以分解為(1+4,2+3)(1+4,2+3)(1+4,2+3)。
給定一個正整數N(1<N<200)N(1<N<200)N(1<N<200)及正整數M(1<M<200)M(1<M<200)M(1<M<200),求有多少種可能的分解組合(注:K+L和L+K算一種)
如果你想跟博主建立親密關系,可以關注博主,或者關注博主公眾號“Python之王”,了解一個非本科程序員是如何成長的。
博主ID:潤森,希望大家點贊、評論、收藏
總結
以上是生活随笔為你收集整理的为了OFFER系列 | 牛客网美团点评数据分析刷题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 六十八、快速幂算法、牛顿迭代法、累加数组
- 下一篇: 玻尿酸填充法令纹之后如何护理?