2020年腾讯实习生算法笔试题目

  • 题目描述
    • 代码示例
  • 题目描述
    • 代码示例
  • 题目描述
    • 代码示例
    • 快速幂求解代码示例
  • 题目描述
    • 代码示例
  • 题目描述
    • 代码示例

  参加了腾讯20年的实习生笔试,本来都不打算写这种笔试的题目。但是感觉着产生的想法很多。首先声明我不是什么大佬,下面写的内容没有得到印证的地方还是会出现偏差,希望各位指正。这里就先谈谈感想,如果笔试编程存在多个题目,而这里有的部分题目不是一下做出来,那么这场笔试就已经变成了多目标优化,而事实是往往很难找到最优点,不知道如何分配时间使你的收益最大化。所以事实就是,往往的结果不是你的收益最大化。
  也许你的坚持浪费在了不该有的题目上,也许再努力一步就会有结果的题目,你却提前终止,所以结果不重要,没必要为了不是最优的结果而悔恨。下面看题目。

题目描述

有一个人需要去打怪物,每打一个怪物需要耗费xix_ixi​的血量,但是会获得yiy_iyi​的金币,然后开局可以使用金币去购买血量,一个金币可以购买qqq点血量,用不完的血量所有怪物结束之后不会保留,每一个怪物都可以选择打或者不打,问最后结束时,可以获得最大的收益是多少。

输入描述
第一行输入nqn\ qn q,分别表示总共有n个怪物,和一个金币可以购买q点血量
接下来的n行,分别是xiyix_i\ y_ixi​ yi​分别是打一个怪物的消耗和金币收益

输入
3 2
1 1
1 10
3 1

输出
10

  这个题目应该算是比较简单的一道了,如果能正确的搞清数据的关系,直接贪心算法就可以了。如果收益大于消耗就一定去打这个怪物,但是收益和消耗需要置换到同一维度,显然以血量为单位比较合适,只需要乘法。计算打一个怪物,收益的血量大于消耗的血量,打完之后,金币收益累加,消耗血量累加,最后决定买多少血量即可。
  因为我的描述有提出关键信息,这一题很简单,但是有很多人因为理解错题意做错了,在考场上,这种情况比比皆是。下面看代码。

代码示例

from math import ceiln,q= [int(i) for i in input().split(' ')]
res = 0
b = 0
for i in range(n):cost,gain = [int(i) for i in input().split(' ')]if gain *q >cost:res += gainb += cost
print(res - ceil(b/q))

题目描述

求函数y2=2Axy^2=2Axy2=2Ax和y=Bx+Cy=Bx+Cy=Bx+C两个曲线所围出的面积。如果没有所围面积,则输出0

输入描述
第一行一个数n,表示测试用例的组数
接下来n行,每行输入三个数,分别是ABCA\ B\ CA B C
每个用例输出一个数,表示面积,相对误差在10−410^{-4}10−4都算对

输入
1
1 1 -6

输出
31.2481110540(大概是这样,反正这样是对的)

  每一个学过高等数学的同学都知道这个题要用定积分处理,所以肯定是先求交点,可能没有交点,此时所围面积就是0了。第一个函数是yyy的二次函数,看起来不方便,把x和y交换,然后联立方程求交点。y=x22A=x−CBy=\frac{x^2}{2A}=\frac{x-C}{B}y=2Ax2​=Bx−C​,就能得到二次函数,最后化简得到判别式>0则两个交点,存在面积,否则不存在面积。
  到求交点都没什么问题,但是后面的操作就有点让我觉得自己是个憨憨。学过数值分析的同学肯定就知道计算机怎么求积分,把一个函数切分成很多矩形或者梯形,然后把矩形(梯形)的面积累加。对了我就这样写了,不超时才怪。
  正经求法应该是要对这个二次函数手动求定积分,求出来是个三次函数,然后带入上下限进行计算,别人是这样过了的。具体细节就不展开了,直接上代码了。

代码示例

n = int(input())
for i in range(n):A,B,C = [int(i) for i in input().split(' ')]delt = 4*A**2/(B**2) - (8*A*C/B)if delt <= 0:print(0)else:x1,x2 = ((2*A/B) - delt**0.5)*0.5 , ((2*A/B) + delt**0.5)*0.5print (abs((x1**3 / (6*A) - x1**2 /(2*B) + x1*C/B) - x2**3 / (6*A) + x2**2 / (2*B) - x2*C/B))

题目描述

一个监狱有n个房子,每个房子的人可以选择一个1~m的数,如果相邻房子的人选择的数字是一样的,就会发生冲突,问发生冲突的可能性有多少种。

输入,mnm\ nm n分别表示可选数字的范围和房间的数目。输出冲突的种类,并对100003取模

输入
2 3

输出
6

  对于样例输入,发生冲突的情况分别是(1,1,1),(1,1,2),(1,2,2),(2,1,1),(2,2,1),(2,2,2)
  这个问题第一遍没想出来是错的,后面想到了可以考虑总的排列数目减去不发生冲突的数目。总的排列数目就是mnm^nmn,然后不发生冲突,第一个人有m个选择,第二个人只需要不和第一个人冲突即可,有m-1种选择,后一个人只需要保证不和前面的发生冲突,所以都有m-1种选择,最终的不发生冲突的种类数就是m∗(m−1)n−1m*(m-1)^{n-1}m∗(m−1)n−1,然后相减对100003取模。我最后关头把这个代码拷贝进去了,也不知道是否成功,因为python没有溢出的概念,这个结果应该可以过比较多的用例。
  据说上面的可以过,但是考虑这两个幂结果可能会非常大,可以考虑用模幂运算来简化,记m′为Mm'为M%pm′为M则有m∗(mn−1−(m−1)n−1)%p=M∗(Mn−1−(M−1)n−1)m*(m^{n-1}-(m-1)^{n-1})\% p=M*(M^{n-1}-(M-1)^{n-1})%pm∗(mn−1−(m−1)n−1)%p=M∗(Mn−1−(M−1)n−1),这样就更加不容易溢出了。

代码示例

m,n= [int(i) for i in input().split()]
m = m%100003
print (m*(m**(n-1)-(m-1)**(n-1))%100003)

  很简单的一道题,但是当时没有投入太多时间,可惜了。之后据某些同学说在python中这样写的代码也会超时,需要进一步优化,这里就使用快速幂做出修改。下面是代码。

快速幂求解代码示例

m,n= [int(i) for i in input().split()]
m = m%100003power = n-1
a,b = 1,1
basem, basem1 = m, m - 1# 快速幂部分,求m和m-1的n-1次方,顺带对100003取模了
while power:if power&1:a = (a * basem) % 100003b = (b * basem1) %100003power >>= 1basem = (basem*basem) % 100003basem1 = (basem1*basem1) % 100003print (m*(a-b)%100003)

题目描述

有n个物品,每个有k个属性,ai,ja_{i,j}ai,j​表示第i件物品的第j个属性,两个物品被称为完美配对需要满足两个物品的任意一个属性之后相等,即ai,j+ak,j=ai,0+ak,0a_{i,j} + a_{k,j} = a_{i,0} + a_{k,0}ai,j​+ak,j​=ai,0​+ak,0​,然后求完美配对的个数

输入描述
第一行n k表示物品数和属性数
接下来n行每行k个数表示第i个物品的k个属性

输出一个数字表示完美配对数

输入
5 3
2 11 21
19 10 1
20 11 1
6 15 24
18 27 36

输出
3

  第一直观感觉就是把之前的物品存起来,然后逐个去计算每个物品是否和之前的是完美配对,判断每一个是否是完美配对需要比较至多O(k)O(k)O(k)次,这样复杂度是O(n2k)O(n^2k)O(n2k)。只能过0.3的用例。
  考虑到每一个数据,只需要对第一个数据做差就能根据第一属性之后的值找到它的完美配对。建立一个哈希表,只存储第二个属性开始减第一个属性的值,这样如果有一个物品从第二个属性开始,也对那个物品的第一个属性值做差,相当于ai,j+ak,j−ai,0−ak,0=0a_{i,j} + a_{k,j} - a_{i,0} - a_{k,0}=0ai,j​+ak,j​−ai,0​−ak,0​=0则是完美匹配。这样就可以把每一种情况使用哈希表存储,快速求出与之对应的完美匹配是否存在。如果存在,存在的数目是多少,可以与所有的情况构成完美配对,就加上这个数即可。
  此时的复杂度就是对每一个数哈希,然后看是否存在哈希表中,复杂度是O(nk)O(nk)O(nk)
  去牛客上看看别人的讨论,有人不知道自己的思路与这个很相似但是过不了,可能就是因为没有考虑,如果一个物品的所有属性都是一样的,显然自己和自己的完美配对是不能算在内的。

代码示例

from collections import defaultdictn,k = [int(i) for i in input().split(' ')]
keys= defaultdict(lambda:0)
b = [0] * (k-1)
res =0
for i in range(n):a = [int(i) for i in input().split(' ')]for i in range(1,k):a[i] -= a[0]b[i-1] = -a[i]if tuple(b) in keys:res += keys[tuple(b)]t = tuple(a[1:])keys[t] +=1print(res)

题目描述

有10710^7107个用户,编号从1开始,这些用户中有m个关系,每一对关系用两个数x,y表示,意味着用户x和用户y在同一圈子,关系具有传递性,A和B是同一个圈子,B和C是同一个圈子,则A,B,C就在同一个圈子。问最大的圈子有多少个用户。

输入描述
第一行输入一个整数T,表示有T组测试数据
每一组测试用例的第一行是一个数n,表示有n对关系
接下来的n行,表示这组测试数据的n对关系,每行两个数x,y
输出T行,表示每一组测试用例最大的圈子人数

输入
2
4
1 2
3 4
5 6
1 6
4
1 2
3 4
5 6
7 8

输出
4
2

  这个题是个基于并查集的问题。我不了解并查集,所以这个题比较暴力,只过了0.4,优化之后只过了0.45,然后就花了不少时间,也没搞出来。关于并查集,大家可以自己在网上搜索讲解。
  这道题我就先讲解一下不使用并查集该如何做,使用普通的集合来做,如果一个关系的两个数已经出现过了,并在出现在不同的集合中,就把两个集合取并,如果一个出现在集合中了,就把另一个数加到集合中,如果两个都没出现,则创建一个新的集合,只包含这两个数。最后对所有的集合最最大长度,这样的代码我只过了0.4,复杂度比较大的地方在于需要遍历集合列表。
  然后优化一下,对每一个数简历一个哈希表,哈希表的值指向一个集合,得到一个关系之后,如果两个数都有各自的集合,则把y集合里所有的元素指向的集合换成x的集(这里的复杂度是蛮大的)。这个时候我过了0.45。
  如果建立一个图,有关系则表示有边连接,然后使用遍历算法找到连通分量,对整个图遍历一遍,因为题目说了节点的数目多于关系的数目,稀疏图,使用邻接矩阵存储。这个方法是我后来想到的。
  最后就是并查集了,并查集为了防止树的高度线性增长,别人通过设置树的高度来减缓高度的增加,这里我直接通过增加树的宽度来减缓树的高度的增加,那就是在递归查找父节点的时候,如果父节点不是根节点,直接把父节点改为根节点。如果有问题,欢迎大家指出。下面是代码。

代码示例

from collections import defaultdictT = int(input())
for i in range(T):A = []n = int(input())node_father = {}def getroot(node):if node not in node_father:node_father[node] = nodeelif node_father[node_father[node]] != node_father[node]: # 如果父节点不是根节点,递归查找根节点,并把父节点设置为根节点node_father[node] = getroot(node_father[node])return node_father[node]for j in range(n):edge =[int(i) for i in input().split(' ')]if edge[0] not in node_father:node_father[edge[0]] = getroot(edge[1]) # 包含处理了两个节点都不存在的情况elif edge[1] not in node_father:node_father[edge[1]] = getroot(edge[0])else:node_father[getroot(edge[0])] = getroot(edge[1])res = 0nodenum = defaultdict(lambda: 0)for node in node_father:root = getroot(node)nodenum[root] += 1res = max(res, nodenum[root])print(res)

2020年腾讯实习生算法笔试题目(感触良多)相关推荐

  1. 腾讯实习生招聘笔试题目

    2013腾讯实习生笔试题  一. 单项选择题 1) 给定3个int类型的正整数x,y,z,对如下4组表达式判断正确的选项() Int a1=x+y-z; int b1=x*y/z; Int a2=x- ...

  2. 2015腾讯暑期实习笔试题目

    2015腾讯暑期实习笔试题目 2015腾讯暑期实习笔试题目 (1).层次遍历序列为ABCDEFG的二叉树,其中序遍历的序列是什么? (2).ABCABC为入栈的顺序,倘若出栈的顺序为ABCCBA,那么 ...

  3. 微软实习生招聘笔试题目

    微软实习生招聘笔试题目 您好!以下是本次微软实习生招聘的笔试题目,请仔细阅读并认真答题: 注意:本次测试题目仅限本人阅读,请勿传阅他人.谢谢! 提交材料 1.不超过2页的说明书,包括算法,设计,使用说 ...

  4. 2014腾讯实习生技术类笔试

    2014腾讯实习生招聘浩浩荡荡地从3月中旬开始在全国各地展开,第一批武汉等,第二批广州等,第三批长沙上海等.抱着热身的念头,我报名参加了第二批城市广州的招聘,投简历,筛选简历,到4月12日参加笔试.很 ...

  5. 2013年阿里巴巴实习生招聘笔试题目及解答

    有幸参加了2013年5月5日阿里巴巴的实习生招聘笔试,这次笔试的难度对我而言,前半部分不涉及算法的内容,都比较容易.而后面3道关于算法的习题都解答得很不好,暴露出来自己的一些问题.本人马上也要毕业了, ...

  6. 百度 腾讯 阿里 小米 笔试题目宝典

     九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾 ...

  7. 【IT企业笔试集】2013年阿里巴巴实习生招聘笔试题目及解答

    有幸参加了2013年5月5日阿里巴巴的实习生招聘笔试,这次笔试的难度对我而言,前半部分不涉及算法的内容,都比较容易.而后面3道关于算法的习题都解答得很不好,暴露出来自己的一些问题.本人马上也要毕业了, ...

  8. 2020年阿里社招的笔试题目2--社招居然也让我笔试醉了

    2020年阿里的笔试题目. /**  * 二.有一个字符串它的构成是词+空格的组合,如"北京 杭州 杭州 北京", 要求输入一个匹配模式(简单的以字符来写), 比如 aabb, 来 ...

  9. 阿里巴巴2020年研发实习生在线笔试题目

    先说一下阿里爸爸的实习生招聘流程,分为提前批和正式批.提前批可以先进行面试,等到阿里校招系统开启后再走流程:正式批是先网上投递简历(或者内推),然后填写素质测评.进行在线笔试.初面.终面.发放offe ...

最新文章

  1. 大数据之---Yarn伪分布式部署和MapReduce案例
  2. inspinia中文管理后台_Bootstrap优秀模板-INSPINIA.2.9.2
  3. 加载torchvision中预训练好的模型并修改默认下载路径
  4. 10-2-文章分页展示
  5. STM32工作笔记0020---新建工程模板基于寄存器-M3
  6. PAT甲级1115 DFS和BST
  7. 本地邮件服务器 易邮 使用
  8. 1047: 对数表 Python
  9. 三角函数中和差角公式的编辑方法
  10. scrcpy---Android投屏神器(使用教程)
  11. VCIP2020:SCC编码工具的优化实现
  12. 计算机存储单位 t后面的单位,字节后面的存储单位是什么
  13. 开源新作!抖音四面被拒,再战头条终获offer,一文搞懂
  14. maven创建web项目
  15. 初级中学计算机知识,计算机基础知识(初级中学级教学方案课程教案).doc
  16. 验证input和textarea的输入是否有效,也就是不为空,也不都是空格
  17. [读书报告]构建之法(九)
  18. 进原神显示服务器错误黑屏,《原神》数据异常怎么办 数据异常问题解决方法...
  19. 完整 ycrcb转rgb
  20. audio realtek 耳机没声_win7系统下realtek high definition audio声卡耳机无声怎么办

热门文章

  1. Python模块——os模块详解
  2. php artisan命令表,php artisan 命令列表
  3. 指纹支付相关的细节处理
  4. Xposed指纹支付插件 安卓版
  5. android x86还是arm,Android x86是否模拟ARM?(Does Android x86 emulate ARM?)
  6. 信息时代的生活到底给我们带来了什么?
  7. 数据库篇-mysql主备搭建
  8. kali Linux 常用软件
  9. (Java生产者消费者问题)http://blog.csdn.net/jhj735412/article/details/6931135
  10. 用python处理html代码的转义与还原 #x27; amp; lt; gt; quot; #x27;等特殊字符