【携程】开发笔试暑期实习春招题解0329

携程第二次笔试,后端算法前端都要做的题,有帮助欢迎点赞评论哦~

T1 计算圆圈个数 直接计数即可。参考代码如下:

import sys
if __name__ == "__main__":
    n = int(sys.stdin.readline().strip())
	print(n.count('0')+n.count('6')+n.count('9')+2*n.count('8'))

T2 排列构造,需要K个好元素。只需要选择0, 2, 4,..., 2*(k-1)下标的地方依次填入n-k+1, n-k+2, ... ,n,也就是倒数k大的数,剩下的地方把剩下的地方填写即可。参考代码如下:

import sys
if __name__ == "__main__":
	n, k = map(int, sys.stdin.readline().strip().split())
	ans = [0]*n
	for i in range(k):
	ans[i+2] = n-k+i+1;
	if i*2+1<n:
	  ans[i*2+1] = i+1
	for i in range(2*k, n):
	  ans[i] = i-k+1
	for a in ans:
	  print(a, end = "")

T3 x的阶乘范围决定了x不会超过15,枚举x,然后y取n/x和(n/x)+1计算哪个绝对值小即可。注意x和y不能取2,但可能取1。提交时感觉有个样例bug,x取1时按理说y直接消了取多少都可以,但是取n不通过,取1就通过了。参考代码如下:

import sys
if __name__ == "__main__":
    n = int(sys.stdin.readline().strip())
	facts = [6]
	for i in range(4, 15):
	  facts.append(facts[-1]*i)
	  minAbs, minX, minY = n, 1, 1
	  for i in range(len(facts)):
		curY = n//facts[i]
		if abs(curY*facts[i]-n)<minAbs and curY!=2:
		  minAbs, minX, minY = abs(curY*facts[i]-n), i+3, curY
		if abs((curY+1)*facts[i]-n)<minAbs and curY+1!=2:
		  minAbs, minX, minY = abs(curY*facts[i]-n), i+3, curY+1
	print(minX, minY)

T4 树形DP,直接DFS,计算孩子允许染色和不允许染色的情况,返回两个状态:一个是不允许自己和孩子之间染色,一个是允许,两种情况下的权值。允许自己和孩子之间染色这个状态即drawAns的计算需要注意一下,应该选择与哪一个孩子染色呢?应当对每一个孩子考虑,“选择与它染色得到的最大权值”和“不选择与它染色”得到的最大权值之差,即代码中的drawDiff,这个差最大的就是染色对权值贡献最大的孩子,我们选择与它染色。参考代码如下:   

import sys
if __name__ == "__main__":
    n = int(sys.stdin.readline().strip())
    G = [[] for i in range(n)]
    for i in range(n-1):
        line = sys.stdin.readline().strip()
        u, v, w = list(map(int, line.split()))
        G[u-1].append([v-1, w])
        G[v-1].append([u-1, w])
    flag = [False]*n
    start = -1
    for i in range(n):
        if len(G[i])==1:
            start = i
            break
    flag[start] = True
    def dfs(node):
        draw, nodraw, drawed = [], [], []   # 存储孩子状态
        for nei, W in G[node]:
            if not flag[nei]:
                flag[nei] = True
                neiNoDraw, neiDraw = dfs(nei)
                nodraw.append(neiNoDraw)
                draw.append(neiDraw)
                drawed.append(W + neiNoDraw)
        if draw:   # 如果不是叶子
            noDrawAns = sum(map(max, zip(draw, nodraw)))   # 不跟孩子之间染色,取孩子所有状态最大值
            drawDiff = [drawed[i] - draw[i] for i in range(len(draw))]  # 假设分别与每个孩子之间染色,比不染多出的权值
            maxDiffIndex = drawDiff.index(max(drawDiff))  # 多出权值最大的孩子
            drawAns = max(noDrawAns, drawed[maxDiffIndex]+sum(draw)-draw[maxDiffIndex])  # 能跟孩子之间染色情况下的最大权值
            return noDrawAns, drawAns
        return 0, 0
    print(max(dfs(start)))

#牛客在线求职答疑中心##我的实习求职记录##牛客解忧铺##携程##携程2024暑期实习#
全部评论
感谢分享,这些题解对于正在准备笔试的同学们应该会有很大的帮助。
点赞 回复 分享
发布于 2023-03-29 22:34 AI生成

相关推荐

2025-12-02 02:15
门头沟学院
最近菊厂陆续开了,极力劝退那些拿13级的985硕士,就13级那么点儿薪资,一线城市每个月到手1.8/7/6w,租房2k还是破烂,吃饭2k还是预制菜,买个1k衣服都是聚酯纤维破塑料,稍微出去浪一浪,能留1w就是万岁,要是再有个啥都想买的对象,一线工作一年难存10w。隔壁工地混泥土,钳工,焊工一天800+,还包吃包住。读书18年到985硕士出来就为了进厂螺丝工?还不如从8岁童工开始干活,别人读书完了你工龄18+,混不上领导也是个小头头了。当然专科进来正式工,od都行,一般本科进来13级也OK,毕竟22岁年纪摆在那个地方还不需要太花钱。读硕博的基本26岁,工作两年就要结婚的,兜里没几个崽,连彩礼都要信用贷。菊厂离职的不少,毕竟正常没人受得了9116(梗:再来一次911刷6)。为啥这时候劝?因为刚下班,因为国考刚完,省考下周,就是可惜选调只有当年应届能报。现在回想能拍断大腿。应届生真实好身份,错过这一次,选调,考公,考编,当老师,进医院,研究所,高校,央国企,基本都无缘了,就连报名资格都被剥夺了,可谓是被党和国家遗弃的废材,统称“社会上的”,扔到社会去流浪,被用坏了就扔医院,长期超负载使用,零件修不好基本可以扔火里回炉重造了。体制内奉行找体制内的,都是党和国家选的人才,智力不差,样貌不丑,身材端正,收入稳定,安居房政策福利待遇也OK。因公出行都是报销,周末顺带“游山玩水“,这种体制内单身资源但凡想找对象,去社会上随便吆喝一声都排队。观察一下,基本没什么公务员在相亲,因为早就被邻里邻居抢光了。
哈哈哈,你是老六:就这不去的人大把人干呢,现在不缺人干活,你不干大把干呢,还有那个说农民工赚钱的,那个800+我估计肯定也就那一段时间,哪有这么赚钱,还是一句话,要想存下钱必须花销极低,能省的就不花钱,工资要高点
点赞 评论 收藏
分享
评论
2
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务