这篇博客记录一下在线笔试用Python写算法题时需要注意的一些事项。
处理输入
一些大公司的在线笔试似乎都承包给了第三方,那个平台下的在线写代码功能真是不能再渣。它并不像LeetCode以及其他OJ一样给定函数声明和函数头部,而是需要你自己去处理输入。
首先,Python下的输入基本都为字符串,在单行输入模式下,对于有混杂数字,字符的情况下,我们可以用raw_input()函数来接受处理。
# 输入:{1, 2, 3},23
s = raw_input()
- 1
- 2
- 3
此时s保存就是整个输入,之后就需要手动的去获得里面的数据了。一般常用的处理字符串的操作(如split
,int
,float
)加上数组切片就可以了。
对于单行输入是纯数字的话,可以使用input()函数来处理。input和raw_input的关系后面提到。
# 输入:23.45
s = input()
type(s) # float
- 1
- 2
- 3
- 4
如果是多行输入呢?比如题目要求多组同时输入,此时我们总不能写个循环使用raw_input函数吧。这时可以使用处理输入的sys.stdin。比如:
# 输入:12\n43\n...
import sys
for line in sys.stdin: # 使用for处理多个输入
print(line)
- 1
- 2
- 3
- 4
- 5
这个时候,line是以字符串的形式保存的一行输入。对于混杂的情况依然需要字符串处理以及切片等操作。不过对于很多的情况,我们可以使用eval函数来处理。eval(str)的含义是将字符串str当成有效的表达式来求值并返回计算结果。比如:
# 例1,输入:{1, 2, 3, 4}
s = raw_input() # s = ‘{1, 2, 3, 4}‘
d = eval(s) # d = {1, 2, 3, 4}
type(d) # set类型
# 例2,输入:0xA
s = raw_input() # s = ‘0xA‘
n = eval(s) # n = 10
hn = hex(n) # hn = ‘0xA‘
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
利用eval,可以很方便的将输入的字符串,并转换为对应的Python类型。另外,由于input函数其实就是调用了raw_input后又用eval函数处理了一下,所以,对于上面两个例子,也可以写成:
# 例1,输入:{1, 2, 3, 4}
d = input() # s = {1, 2, 3, 4}
type(d) # set类型
# 例2,输入:0xA
n = input() # n = 10
- 1
- 2
- 3
- 4
- 5
- 6
input & raw_input
它两的关系如下:
def input(prompt):
return eval(raw_input(prompt))
- 1
- 2
- 3
即raw_input接受返回的只是字符串,而input接受返回的是经过eval进行类型转换后的字符串值,当然,如果输入不能用eval函数处理的话,也会报错。
sys.stdin & input & raw_input
sys.stdin和后面两个都是获取输入的,不过后面两个一般只在处理单行输入时才使用。下面两个是等价的:
import sys
line = sys.stdin.readline()[:-1] # sys.stdin会接受最后的`\n`,而raw_input不会
- 1
- 2
- 3
等价于:
line = raw_input()
- 1
- 2
使用sys.stdin.readlines()
时能够获取多行输入,在Windows下需要Ctrl+z来停止输入。
补充样例
题目来自hihoCoder上的A+B题。
描述
求两个整数A+B的和
输入
输入包含多组数据。
每组数据包含两个整数A(1 ≤ A ≤ 100)和B(1 ≤ B ≤ 100)。
输出
对于每组数据输出A+B的和。
代码:
while True:
try:
(n, m) = (int(x) for x in raw_input().split())
print(m + n)
except EOFError:
break