牛客网大厂在线笔试输入输出练习python3版
牛客网大厂在线笔试输入输出练习python3版
- 写在前面
- 1
- 解法一:
- 解法二:(错误解法)
- 2
- 解法一
- 解法二:错误解法
- 解法三
- 3
- 解法一
- 解法二
- 4
- 解法一
- 解法二
- 5
- 解法一
- 解法二
- 解法三
- 解法四
- 6
- 解法一
- 解法二: 错误解法
- 7
- 解法一
- 解法一
- 解法二
- 8
- 9 输出成指定格式
- 总结
- 补充知识点
- 1 input()函数
- 2 map函数
- 3 split()函数
- 4 strip(),lstrip(),rstrip()函数
- 5 try except函数
- 6 sys.stdin()和sys.stdin.readline()函数
- 再补充一些
- 最后的建议
- 最后再总结一下
写在前面
最近在投简历找工作,碰到了一个大坑,就是在线笔试时的输入输出问题。前几天一道笔试题,明明在pycharm中调试完全无误,在牛客网中就是0的通过率。后面改了下输入输出格式,秒变40%。。。所以今天想总结下这些输入输出问题。ps,这里写的是python3版,不是代表还有其他如C++的版本,是因为我刷题从来只用python3。
代码和题目均来自牛客网。
所有题目均为两数相加,但输入输出格式不一样,我们具体来看。
1
解法一:
import sysfor line in sys.stdin:a, b = map(int,line.split())print(a+b)
第一种解法属于通用解法。下面我们再来看另一种通用解法。
解法二:(错误解法)
while True:a,b=map(int,input().split())print(a+b)
注意,这种解法在pycharm是正确的。但在牛客网中通过率为0。假如我们把第一行 while True: 去掉,那么通过率会变成1%。真有趣。我们来看下牛客网给出的错误提示:
这个报错的原因我搜了很久,说实话,我没太看懂。大概的意思是说,有些ide支持,有些不支持。所以在pycharm中可行,在牛客网的网页上不行。但是我以后再也不会用这种方法了。
解决办法一是改为解法一的格式。
解决办法二是使用try…except…格式。
while True:try:a,b=map(int,input().split(' '))print(a+b)except:break
这样就能成功通过了。
2
注意下,第2题和第1题的不同之处在于,第2题的首行限定了整体的输入行数。
解法一
import sysfor line in sys.stdin:s = line.split()if len(s) == 1:# if 的作用是处理第一行的输入n = int(s[0])else: print(int(s[0])+int(s[1]))
这段代码可通过运行,但是没有体现第一行数据的作用。但是因为我们的输入数据行数都是已经设定好了的,所以可以完全通过。
解法二:错误解法
while True:
n=int(input())
for _ in range(n):a,b=map(int,input().split())print(a+b)
这是很多人能想到的常规解法,很遗憾这种解法也是错误的。你能猜到错误类型是什么吗?没错,和第1题的错误解法报错一模一样。所以加上 try… except…就好了。这里再次提醒打死也别用这种解法了。用的时候一定加上 try… except…
while True:try:n=int(input())for _ in range(n):a,b=map(int,input().split())print(a+b)except:break
解法三
n = int(input().strip())
for _ in range(n):nums=[int(c) for c in input().split()]print(sum(nums))
这里讲一下为何用了input().strip()之后就不会报错了呢?
因为第一行我们只有1个数,输完这个数之后需要进行换行操作。如果只有input(),则IDE并不会知道我们要进行换行了。strip()函数是用来删除元素的函数。当我们输入第一行的一个数之后再输入换行符时,strip()函数则会接受这个换行符并将其删除,这样刚好可以对应IDE不报错。觉得try except麻烦的同学可以用这个。
3
解法一
import sys
for line in sys.stdin:a,b=map(int,line.split())if a==0 and b==0:breakprint(a+b)
解法二
while True:a,b=map(int,input().split())if a==0 and b==0:breakprint(a+b)
这个时候不知道为哈这种解法不报错了。可能是因为结尾有00作为输入结束条件吧。也欢迎读者可以解答下笔者的这个疑惑,感激不尽。
4
解法一
while True:nums = [int(c) for c in input().split()]if nums[0] == 0: breakprint(sum(nums[1:]))
解法二
while True:s = input()if s == "0":breakelse:a = [int(i) for i in s.split()]print(sum(a[1:]))
5
解法一
import sys
t = int(sys.stdin.readline())
for i in range(t):lst = list(map(int,sys.stdin.readline().split()))print(sum(lst)-lst[0])
解法二
n = int(input())
for _ in range(n):x = [int(x) for x in input().split()]print(sum(x[1:]))
解法三
while True:try:t = int(input())for i in range(t):n = list(map(int,input().split()))sum = 0for j in n:sum = sum + jprint(sum-n[0])except:break
解法四
n = int(input())
for i in range(n):print(sum(list(map(int, input().split()))[1:]))
6
解法一
while True:try:nums = list(map(int, input().split()))print(sum(nums[1:]))except:break
解法二: 错误解法
while True: x = [int(x) for x in input().split( )]print(sum(x[1:]))
正确解法:
while True:try:x = [int(x) for x in input().split( )]print(sum(x[1:]))except:break
这道题我在答案区中很罕见地没有见到使用sys.stdin的解法。
7
解法一
import sys
for line in sys.stdin:s=[int(x) for x in line.split()]print(sum(s))
解法一
while True:try: nums = [int(x) for x in input().split( )]print(sum(nums))except:break
解法二
while True:try:nums=list(map(int,input().split()))print(sum(nums))except:break
温馨提示,这道题如果不加try except则又会报错。
8
n = int(input())
a = []
nums = 0
for _ in range(n):a.append(list(map(int, input().rstrip().split())))
for i in range(n):nums += sum(a[i])
print(nums)#思路是将输入数据都加到一个列表中,最后会得到一个二维列表,再遍历并对这个二维列表求和即可。
9 输出成指定格式
今天在练习时碰到错误是这样的:
输出应该为: 100 200
你的输出为: 100,200
气人不?在pycharm中直接打印是不会显示逗号的。
print(100,200)
# output: 100 200
修正如下:
print('%d %d' % (100,200))
#output: 100 200
这才是货真价实的中间有空格的输出。在线笔试时要想到这个问题太难了。
总结
想写一个总结,但是无从下笔。原因是因为自己也是一知半解。虽然我把各种答案都有copy在上面,但是现在盖住上面的答案,我还是无法准确百分百写出准确解,有些报错的地方也没弄懂为什么。
。。。
一天过去了,这篇博客还没发出来,我痛定思痛,准备着手弄懂每个细节来。
补充知识点
1 input()函数
这里只说明比较重要的一点,当我们使用input()函数的时候,我们会从标准输入中读取一个string,即字符串。无论我们的初衷是想得到一个整数、小数、或其他的值,input函数都会在我们得到的值的左右两边加上一个引号(" ")。我们可以用int()等函数再做加工处理。这里再说一句,对于用户输入的换行是不会读入的,因为input()函数是以换行作为输入结束的标志。
2 map函数
语法:map(function,iterable,…)
描述:map()会根据提供的函数对指定序列做映射。第一个参数function以参数序列中的每一个元素调用function函数,返回包含每次function函数返回值的新列表。
实例:
a, b = map(int, [1, 2])
print(a)
# output:1
坑:这里经常会遇到一个坑,习惯于使用map之后,对于输入一个整体行数,我也会使用map函数。
a = map(int, 1)
print(a)
#output TypeError: 'int' object is not iterable
这种情况下会报错,原因在于 1 不是一个序列。
所以,
结论:
在输入只有1个数时,千万别用map函数。
3 split()函数
split()函数的作用是拆分字符串,通过指定分割符对字符串进行切片,并返回分割之后的字符串列表list。
split()函数的默认分隔符为空格,但是不能为空(")。例如:
a, b, c, d = map(int,input().split(''))
print(a, b, c, d)
output:ValueError: empty separator
4 strip(),lstrip(),rstrip()函数
这里直接参考这篇博客就行,讲的非常好。简单来说,strip() 是删除首位的空格、换行符,而lstrip()是删除字符串左边的,rstrip()是删除字符串右边的。https://blog.csdn.net/csdn15698845876/article/details/73469234?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf
5 try except函数
这个自己百度吧,因为也不是很重要。总之加上这个函数之后,性能一定大于等于没加上这个函数的。
6 sys.stdin()和sys.stdin.readline()函数
sys.stdin和input()函数是python中两大常用的输入函数。
input()函数区别与sys.stdin的地方在于input()的括号内可以直接填写说明文字。例如:
n=input('请输入:')
sys.stdin.readline()函数会将标准输入全部获取,包括末尾的’\n’,而input()则会将’\n’忽略。
我们看个例子就明白了。
import sys
a=sys.stdin.readline()
b=input()
print(len(a),len(b))执行:
abc
abc
4 3
import sys
a=sys.stdin.readline().strip()
b=input()
print(len(a),len(b))执行结果:
abc
abc
3 3
这里strip()函数的作用就是将字符串末尾的 \n换行符去除。
讲了这么多,上面的知识点真正对我们做输入输出练习的是什么呢?
再补充一些
1 很多情况下,笔试题都是要求我们输出一行,然后马上输出答案。这个时候,我们如果想连续输入两行再输出答案,该如何操作?
总结就是,在连续输入的两行中间,不能做任何的print操作。(感觉好像说了废话)
2 当输入的测试数组组数不固定时,使用while True:
操作,输入一组测试数据,便马上输出一组结果。
最后的建议
形成一套自己的风格的输入输出模式,在sys.stdin()和input()之间选用吧。
最后再总结一下
如果是对于一行输出一行结果,可直接用 nums = [int(x) for x in input().split( )] 将输入的数用空格隔开并以整数形式存入列表中。
如果多行输入对应一行输出,则要记得使用循环,将多行输入一起存在一个二维数组中。
n = int(input())
a=[]
for _ in range(n):a.append(list(map(int, input().strip().split())))
print(a)#output:
2
1 2
2 3
[[1, 2], [2, 3]]
参考资料:
[1]https://blog.csdn.net/xu_xiaoxu/article/details/83339856?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf
[2]https://blog.csdn.net/qq_29883591/article/details/78177279
[3]https://blog.csdn.net/hitzijiyingcai/article/details/90736590
牛客网大厂在线笔试输入输出练习python3版相关推荐
- 牛客网C语言考试输入输出问题
如果是用C语言考试,且HW的需要自己写输入输出的,请注意. 以下绝对不能用 void main() { return ; } 图省事不写返回值,但是会导致网站一直报错,输出无法正常输出,fflush( ...
- 牛客网>在线编程 > 剑指Offer>入口
牛客网:剑指offer 在线刷题入口 注:有事没事刷两下,活动活动脑子.
- 洛谷、牛客网、AcWing 刷题(python版)
牛客网python专项练习整理(一) https://blog.csdn.net/weixin_41913008/article/details/87203468 牛客网剑指offer--python ...
- Java算法:牛客网腾讯笔试真题算法Java版1-11题
题号 题目 知识点 难度 通过率 QQ1 生成格雷码 递归 简单 22.61%QQ2 微信红包 模拟 简单 25.61%QQ3 编码 字符串模拟 中等 26.60%QQ4 游戏任务标记 模拟 中等 3 ...
- 牛客网编程题python输入输出_牛客网算法题目记录
车站建设问题 有10^8个村庄排在一条公路上,依次编号为0~10^8-1,相邻村庄距离为1,其中有n个村庄居住着牛牛,居住着牛牛的村庄从小到大依次为a0~an-1,其中保证a0=0. 现在需要建设车站 ...
- Java算法:牛客网字节跳动笔试真题算法Java版1-27题
题号 题目 知识点 难度 通过率 ZJ1 附加题 动态规划数组 中等 16.45% ZJ2 编程题1 贪心 中等 11.65% ZJ3 编程题2 字符串贪心 中等 29.30% ZJ4 附加题 递归模 ...
- Java算法:牛客网拼多多笔试真题算法Java版1-13题
题号 题目 知识点 难度 通过率 PDD1 最大乘积 贪心模拟 中等 14.45%PDD2 大整数相乘 模拟 中等 27.32%PDD3 六一儿童节 贪心 中等 24.74%PDD4 迷宫寻路 模拟 ...
- 计算机网络笔试牛客网,招银笔试
下来以后自己写了一遍,好像还是不太对,晕乎乎的,有没有大佬教教我呜呜 import java.util.*; import java.io.*; class test { public static ...
- 华为牛客网在线笔试题之是否是回文串
最近投了个华为的简历,然后收到了牛客网的在线笔试,题目有三道,第一道是给定一串字符,找出其中最长的回文串,并返回其长度. 我用C++实现的,思路是遍历字符串的每一个字符,然后设置初始值为1的偏移量,如 ...
最新文章
- Objective-C设计模式——外观Faced(接口适配)
- 阿里代码规范插件 中文使用手册 FOR Eclipse
- WPF-3D动效-文字球形环绕
- 【转】ABAP的坑5
- POJ1741:Tree——题解+树分治简要讲解
- HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询
- python 机器学习资料
- Oracle函数大全1
- pygame render怎么显示中文_PyGame开发游戏(2D)02.基础图元
- java 导出wps_用java将数据导出到wps表格中,怎么实现
- 解决 ‘Response‘ object has no attribute ‘body‘
- (六)数据处理——录入、清洗、加工、描述
- 全套AI平面设计软件教程案例素材免费分享
- Html5视频video标签中使用blob实现视频播放加密
- Android NDK开发(十三):JNI函数接口详解—线程相关
- php扩展 sockets,php sockets扩展安装配置详解
- 7种常用函数图象及4种函数图象变换规则
- Devcon2 (第二届全球区块链开发者峰会)演讲PPT下载
- centos7 安装docker-ce社区版 ,最新版本docker,docker阿里云加速
- Parameter 参数与 Argument 参数