牛客网大厂在线笔试输入输出练习python3版

您所在的位置:网站首页 牛客网的笔试题 牛客网大厂在线笔试输入输出练习python3版

牛客网大厂在线笔试输入输出练习python3版

2023-06-08 15:48| 来源: 网络整理| 查看: 265

牛客网大厂在线笔试输入输出练习python3版 写在前面1解法一:解法二:(错误解法) 2解法一解法二:错误解法解法三 3解法一解法二 4解法一解法二 5解法一解法二解法三解法四 6解法一解法二: 错误解法 7解法一解法一解法二89 输出成指定格式总结补充知识点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 sys for 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 sys for 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: break print(a+b) 解法二 while True: a,b=map(int,input().split()) if a==0 and b==0: break print(a+b)

这个时候不知道为哈这种解法不报错了。可能是因为结尾有00作为输入结束条件吧。也欢迎读者可以解答下笔者的这个疑惑,感激不尽。

4

在这里插入图片描述

解法一 while True: nums = [int(c) for c in input().split()] if nums[0] == 0: break print(sum(nums[1:])) 解法二 while True: s = input() if s == "0": break else: 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 = 0 for j in n: sum = sum + j print(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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3