数据分析笔试

牛客网真题

笔试部分

一、美团点评2020校招数据分析方向

1、广告分析

1、广告是互联网企业重要的变现模式,在美团的广告业务中,商家会和美团的销售签订不同类型的广告合同(比如,按点击收费的广告cpc、按曝光收费的广告cpm、按时长收费的广告cpt)。美团会为商家创建相关的广告内容素材创意(比如,门店图片、活动图片、促销文字等),并通过美团的广告引擎,根据用户访问的行为特征,基于算法策略将商家的广告内容投放到美团的app或者外部合作伙伴(比如如:腾讯,头条)的app不同的展示位置上。普通用户访问这些广告后,会对商家产生兴趣,可能产生购买转换行为,美团会和商家做广告的计费结算,同时为商户提供用户的广告效果信息(比如:广告带来的门店访问量、订单数等)。

(1)、 如果让你对这个业务进行抽象,你会抽象出哪些数据分析主题,并说出你这样分的原因;

收费模式:按点击收费的广告cpc,按曝光收费的广告cpm,按时长收费的广告cpt

广告投放流程:广告素材创意 => 用户访问的行为特征 => 基于算法策略 => 投放到美团的app或者外部合作伙伴的app => 不同的展示位置上

商家引流流程:广告投放 => 用户访问 => 购买转换行为 => 和商家做广告的计费结算 => 为商户提供用户的广告效果信息(访问量、订单数量)

从广告的角度: 广告素材特点和用户访问量的主题:用来分析不同特点和素材的广告对吸引用户访问是否有较大的关系。

从用户的角度: 用户访问行为特征和最终购买行为主题:分析用户在广告页面滑动、点击、停留等特征,是否对最终购买行为有较大的关系。

收费模式、商户类型、商户付费的关系:分析不同类型的商户在不同模式下的付费意愿,用于向未使用广告业务的商户推广

投放时段和访问量订单数的关系:能带来高访问量或订单数的投放时段,价格可以适当调整

不同类型商户广告投放的效果分析:分析哪些类型商户广告投放效果较差,可以帮助商户调整引流策略

(2)、 请你根据问题1抽象的主题,进行主题模型设计,并说明设计的模型内容,以及模型之间的关系。

用户访问行为特征和最终购买行为主题:特征值可以选择用户点击进入广告后的行为特征,包括滑动速度、滑动方向、停留时间、点击等。

结合最终购买行为,用来分析用户行为特征对购买行为的影响。可以实时预测用户行为是否有较大几率产生购买行为。对购买意愿弱的用户,可以在页面中实施其他推广营销策略,加强用户的购买意愿。

2、说明关系型数据库通过索引提升查询效率的背后原理

  1. 如果没有索引,数据库引擎需要通过全表扫描来查找数据,这会产生大量的磁盘IO。

  2. 关系型数据库使用B+树构建索引来加速加快查询。B+树是一种二叉查找树(每个节点的键值必须:比保存在左子树的任何键值都要大,比保存在右子树的任何键值都要小),这样随机查找某个键值时可以通过从根节点执行二叉查找来加速查询,查询成本取决于树的层数。

  3. 针对范围查询和排序的优化:在每个叶子节点保存其下一个叶子节点的指针,这样当指定范围范围查询时,先从根节点根据范围的左值找到其叶子节点,之后通过向后遍历叶子节点即可找到对应范围右值,这样可以加速范围查询、排序、分组等数据库查询动作。

  4. 针对磁盘读写速度的优化:除了叶子节点之外的其他节点只保存键值,这样对磁盘的单次读写可以获取到尽可能多的数据。以MySQL为例,一个1000万行的表对应的B+树按照主键查找理论上只需要3次磁盘IO,这相对于全表扫描带来的磁盘IO是多个量级的性能提升。

  5. MySQL等数据库引擎在实际实现B+树索引的时候,针对磁盘读写做了优化:非叶子节点中只存放key值,叶子节点中除了key值也会存放数据,按照存放数据的不同索引区分为主索引(聚簇索引)和辅助索引:

​ a) 主索引的叶子节点中存放该key值对应的完整记录,使用主索引进行查找时,可以直接输出记录;一个表只能创建一个主索引。

​ b) 普通索引的叶子节点则存放对应主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找;一个表可以创建多个辅助索引。

  1. 除了B+树,关系型数据库一般也支持哈希索引,哈希索引能够非常高效地进行随机查找,但是对于范围查询、排序和分组都不支持。

3、污水处理问题

一家污水处理厂通过去掉污水中有害的污物来净化水质,生产出用于灌溉使用的水源。该处理过程每小时可以去掉处理池中剩余污物的12%。

问:1.一天后处理池中将大概处理掉百分之几的污物?

​ 2.要多长时间才能把污物的量减少一半?

4、编程题:旗子翻转

在4*4的棋盘上摆满了黑白棋子,黑白两色的位置和数目随机其中左上角坐标为(1,1),右下角坐标为(4,4),现在依次有一些翻转操作,要对一些给定支点坐标为中心的上下左右四个棋子的颜色进行翻转,请计算出翻转后的棋盘颜色。

输入描述

给定两个数组,分两行,第一行为分别为初始棋盘,为4*4矩阵,其中0表示白色棋子,1表示黑色棋子,第二行为翻转位置,其中翻转位置共有3个

输出描述

请返回翻转后的棋盘,为4*4矩阵

输入例子:[[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]]

def tools(x):
    return 0 if x == 1 else 1

def reverse(board, position):
    for pos in position:
        row,col = pos[0]-1, pos[1]-1
        if row > 0:
            board[row-1][col] = tools(board[row-1][col])
        if row < 3:
            board[row+1][col] = tools(board[row+1][col])
            
        if col > 0:
            board[row][col-1] = tools(board[row][col-1])
        if col < 3:
            board[row][col+1] = tools(board[row][col+1])
    return board

if __name__ == '__main__':
    board = eval(input())
    position = eval(input())
    board = reverse(board,position)
    print(str(board).replace(' ',''))
    print(type(str(board).replace(' ','')))

5、编程题:寻找最后的山峰

def top(l):

# 考虑边界
    l.insert(0,float('-inf'))
    l.append(float('-inf'))
    for i in range(len(l)-1,-1,-1):
        if l[i] >= l[i-1] and l[i] >= l[i+1]:
            return i - 1

        
if __name__ == '__main__':
    l = list(map(int, input().split()))
    print(top(l))

7、[编程题]关联查询。

数据对象data1List,员工表,存储员工ID,员工姓名 数据对象data2List, 员工工作时长表,存储员工ID,月份,工时 计算每个员工1-3月每月工时及总工时。
(1)输入描述:
员工ID 员工姓名
员工ID 月份 工时 月份 工时 月份 工时
(2)输出描述:
员工姓名 空格 一月份工时 空格 二月份工时 空格 三月份工时 空格 总工时
(3)输入例子:
1 zhangwei01
1 01 200 02 150 03 196
(4)输出例子:
zhangwei01 200 150 196 546

def workingTime(list1, list2):
    t1 = list2[2]
    t2 = list2[4]
    t3 = list2[6]
    t = int(t1)+int(t2)+int(t3)
    result = [list1[1], t1, t2, t3, t]
    return ' '.join(map(str, result))
      
if __name__ == '__main__':
    list1 = input().split()
    list2 = input().split()
    print(workingTime(list1, list2))

一些小知识:input()输入的是一个str; split()后返回的是一个列表,列表中的元素是str
对于input(),如果你要传递参数是一个列表而且要求你输入的也是列表的形式,你需要使用eval函数,将引号去掉eval(input())
如果你传递的参数是列表,但是你输入的是数字 空格 数字 空格形式,你需要使用split()函数,input().split(),他是一个列表,列表中的数字是字符串的形式;但可以使用map将元素形式改为整形:list(map(int, input().split())),对于map(int, input().split())他得到的是一个map类型,你可以使用list打开转化成list,也可以根据里面元素的多少进行赋值,比如a,b = map(int, input().split())\

九:[编程题]月份天数。输入年份月份,请输出这个月的天数

(1)输入描述:
多组输入输出
第一个参数为年份,如2018代表2018年,2019代表2019年第二个参数为月份,如1代表1月,2代表2月
(参数间均以空格隔开)
(2)输出描述:
输出当月的实际天数。
(3)输入例子:
2018 2
2020 2
2019 1
(4)输出例子:
28
29
31

def judge(year, month):
    if month in (1,3,5,7,8,10,12):
        return 31
    if month in (4,6,9,11):
        return 30
    if month == 2:
        if (year % 100 != 0 and year % 4 == 0) or (year % 400 == 0):
            return 29
        else:
            return 28
if __name__ == "__main__":
    while True:
        try:
            year, month = map(int, input().split())
            print(judge(year, month))
        except:
            break

发布了49 篇原创文章 · 获赞 2 · 访问量 1821

猜你喜欢

转载自blog.csdn.net/liuluTL/article/details/105381566
今日推荐