牛客网python刷题_牛客网刷题

做题
19题:
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1、 记录最多8条错误记录,循环记录(或者说最后只输出最后出现的八条错误记录),对相同的错误记录(净文件名(保留最后16位)称和行号完全匹配)只记录一条,错误计数增加;
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。
题解:
dic = dict()#创建空字典,可以之间用dict[name] = 'file',生成name 和 ‘file’的键值对
name_lines = []#创建文件列表
while True:
try:
lst = list(input().split())#将输入转化列表,split()即表示以空格划分,即将文件名与行数分割,lst[0]为文件名,lst[1]为代码行数
nam = lst[0]#取出列表的第一项,即取出文件名字
name = nam.split('\\')[-1][-16:]#取文件分割最后的一个字符,即取文件名字。取名字的最后16个字符
name_line = name + ' ' + lst[1] #将文件名字 和 代码行数都存入name_line,中间用空格间隔
if name_line not in dic:
dic[name_line] = 1
else:
dic[name_line] += 1
if name_line not in name_lines:
name_lines.append(name_line)
except:
for item in name_lines[-8:]:
print(item + " " + str(dic[item]))
break
77题火车进站
res = []
# every time trav stack(parking) have two
# operation: 1. pop the stack 2. add ele to stack
#
def trav(nodes, parking, result):
if not nodes and not parking:
res.append(" ".join(map(str, result)))
return
# pop the stack
if parking:
result.append(parking.pop())
trav(nodes, parking, result)
parking.append(result.pop())
# add ele to stack
if nodes:
parking.append(nodes.pop(0))
trav(nodes, parking, result)
# recovery
nodes.insert(0, parking.pop())
while True:
try:
parking = []
result = []
nums = int(input())
nodes = list(map(int, input().split()))
# default go throug the station
trav(nodes, parking, result)
res.sort()
for seq in res:
print(seq)
except:
break
68题 排序
这里因为python 内置的排序就是稳定的排序(相同值的元素,排完序之后相对位置不发生变化),所以可以直接拿来使用。
需要注意是sorted并不改变操作对象本身的排序,而是返回一个新的排完序之后的对象。
由于针对的是元组里面的第二个元素进行排序,所以需要指定key,因为默认是用元组中的第一个元素进行排序
while True:
try:
stu = []
nums = int(input())
style = int(input())
for i in range(nums):
name,grad = input().split()
stu.append((name, int(grad)))
if style == 0:
l1 = sorted(stu, key=lambda x:x[1],reverse=True)
else:
【牛客网python刷题_牛客网刷题】l1 = sorted(stu, key=lambda x:x[1])
for key,value in l1:
print("{0} {1}".format(key, value))
except :
break
24题 合唱队
这题实际上是一个最长上升子序列问题,也就是说找到当前元素的最长上升子串
如果需要使出列的人数最少,则应该选择串中元素所能组成的最长的子串并符合规则左边的k1 < k2 < ... < kx > kx+1 > kx+2 > ... > kn
所以需要求出每个元素的所有左边最长符合条件的子串以及右边最长符合条件的子串
求取某一边最长子串是对该边每一个元素进行计算,求取该元素该边的最长子串,所以可得公式
最长符合条件的子串为
符合条件的 kn > kn-1, kn = max(kn-1,kn-2,...,k0) + 1
while True:
try:
nums = int(input())
order = list(map(int,input().split()))
# the point of ascend view
asc = [1] * nums
# the point of descend view
des = [1] * nums
# revise order
rev = order[::-1]
for idx, val in enumerate(order[1:], 1):
if val > order[idx - 1]:
asc[idx] += asc[idx - 1]
else:
asc[idx] = asc[idx - 1]
print(asc)
for idx, val in enumerate(rev[1:], 1):
print(val)
if val > rev[idx - 1]:
des[idx] += des[idx - 1]
else:
des[idx] = des[idx - 1]
print(des)
except Exception as e:
print(e)
break
调试
写python代码时经常碰到,有异常,但是编译的时候没有提示,这是因为没有捕获异常,想要捕获所有的异常,可以直接捕获Exception,这样就捕获了大部分异常情况即可:
try:
# some code
except Exception as e:
print(e)
break
参考

    推荐阅读