腾讯暑期实习常规批笔试,数据分析岗

1,游戏
问题:开始前可以用金币购买血量,然后可以选择挑战几个怪物,求最大金币收益。
给定怪物个数n,和每个金币可以购买的血量m
然后是n行,每行代表怪物需要消耗的血量和奖励的金币

解法:循环
n,m = map(int, input().split())
tem=m  #剩余的血量
cost=1 #开局使用的金币数
gain=0 #获得的金币
res=[]
for i in range(n):
    c,g = map(int, input().split())
    while tem<c:
        tem+=m
        cost+=1
    tem-=c
    gain+=g
    res.append(gain-cost)
print(max(res)
2,积分
问题:两个线段分别为y2=2Ax;y=Bx+C。
输入ABC;求两者围起来的面积

解法:对y积分
两式联力,求交点的y坐标(根据求根公式判断有无焦点)
对y积分求面积
# -*- coding: utf-8 -*-

def func(A, B, C):
    delta = A**2-2*A*B*C
    if delta <= 0:
        return 0
    y1 = (A + delta ** 0.5) / B
    y2 = (A - delta ** 0.5) / B
    if y1 > y2:
        y1, y2 = y2, y1
    s1=-y1**3/6/A+y1**2/2/B-C*y1/B
    s2=-y2**3/6/A+y2**2/2/B-C*y2/B
    return s2-s1
 
while True:
    try:
        n = int(input())
        for i in range(n):
            A, B, C = map(int, input().split())
            print(func(A, B, C))
    except:
        break
3,
问题:n个房间,每个房间可以报1,2,3,……m的数字,求存在两个相邻房间报数相同的情形总数%100003

解法:
(1)概率论:所有情形数-相反事件的情形数,其中相反事件为任意相邻房间报数不同
直接使用该式30%
(2)快速幂:x**0=1,如果幂是奇数,则等于x乘以x**(n-1);如果幂是偶数则等于x**(n/2)**2
需要在每一步均取余数
def fastExpMod(b, e, mod):
        #快速幂函数
    if e==0:
        return 1
    if e%2==1:
        return fastExpMod(b,e-1,m)*b%mod
    else:
        return fastExpMod(b,e/2,m)**2%mod

mod = 100003
m, n = map(int, input().split())
x1 = fastExpMod(m,n,mod)
x2 = m*fastExpMod(m-1,n-1,mod)
print((x1-x2)%mod)
4,
问题:
n行,k列
如果两行的和每个元素相等,则为一对。求总对数
例如第一行为1,2,3,第二行为4,3,2。

解法:
找出变化值相反的,使用变化值作为字典的键
from collections import defaultdict
 
n, k = map(int, input().split())
nums = []
dic = defaultdict(int)
for i in range(n):
    x = list(map(int, input().split()))
    tmp = []
    for j in range(k-1):
        tmp.append(x[j+1]-x[j])
    dic[tuple(tmp)] += 1

res=0
for key,val in dic.items():
    inv=tuple([-i for i in key])
    if inv==key:    #需要考虑变化值为0的情况
        res+=val*(val-1)
    else:
        res+=val*dic[inv]
print(res/2)
5,LeetCode 547 朋友圈
共有n个关系,每个关系包括两个点。所有有关系的点都在同一个圈里,求最大的圈含有点的个数
from collections import defaultdict
 
T = int(input())
for i in range(T):
    graph = defaultdict(list)
    sts = set()
    
    n = int(input())
    for j in range(n):
        a, b = map(int, input().split())
        graph[a].append(b)
        graph[b].append(a)
        sts.add(a)
        sts.add(b)

    res = 1
    vis = set()    #vis:全局浏览记录
    for i in sts:
        if i in vis:continue
        q = [i]     #q:队列,广度优先搜索
        vis1=set()    #vis1:该圈浏览记录
        while q:
            x = q.pop(0)
            vis.add(x)
            vis1.add(x)
            for y in graph[x]:
                if not y in vis1:
                    q.append(y)
        res = max(res, len(vis1))
    print(res)












#2021届暑期实习正式批笔试##笔试题目##腾讯#
全部评论
不愧是LM的骄傲
1 回复 分享
发布于 2020-04-27 20:44
大佬,求捞
点赞 回复 分享
发布于 2020-04-27 20:41
这么详细,还带答案,爱了爱了
点赞 回复 分享
发布于 2020-04-27 20:42
参考https://www.nowcoder.com/discuss/417979?type=post&order=time&pos=&page=1&channel=
点赞 回复 分享
发布于 2020-04-27 20:55
感觉第一题的题目表述不太清楚,代码和题目的意思有点歧义。
点赞 回复 分享
发布于 2020-10-21 17:01

相关推荐

12-09 12:21
门头沟学院 C++
l11hy:今早刚开,已满足
点赞 评论 收藏
分享
评论
6
18
分享
牛客网
牛客企业服务