看到各位大佬的恐怖码量,相信一定有人和本菜鸡一样不寒而栗:
看到这种题,cpp要手动模拟,要写当然也可以,只是很麻烦
懒癌发作不想写怎么办?
用python!众所周知解释型语言的eval真是好用。
冲冲冲:
a=input().replace('^','**')
a=a.replace('/','//')
print(eval(a)) 只能过60%。
这是因为出题人:
还有可能出现多余括号情况
直接eval会被卡,那就字符串处理一下,删掉多余的左括号和右括号就好了。
str似乎不可以精准pop,但是转成list以后就可以精准删除指定位置的元素了
a=input().replace('^','**')
a=a.replace('/','//')
cnt=0
r=[] # 多余的右括号下标
for i in range(len(a)) :
if a[i]=='(' : cnt+=1 # 其实就是栈
elif a[i]==')' :
if cnt==0 : r.append(i)
else :cnt-=1
la=list(a)
for i in r:la.pop(i)
n=len(la)
cnt=0
l=[] # 多余的左括号下标
for i in range(n):
if la[n-1-i]==')' : cnt+=1
elif la[n-1-i]=='(' :
if cnt==0 : l.append(n-1-i)
else : cnt-=1
for i in l : la.pop(i)
a=''.join(la) # 转换回字符串
print(eval(a)) 没有代码格式化是因为懒得打开vscode直接在牛客写的
感谢@小鸣壹号 同学的指正,上面的代码出现了一个问题,也就是在清除右括号下标的时候,没有按照从后往前的顺序pop,这导致了存在多个右括号时的索引错位的状况。
修改后的代码如下:
a = input().replace('^', '**')
a = a.replace('/', '//')
cnt = 0
r = [] # 多余的右括号下标
for i in range(len(a)):
if a[i] == '(': cnt += 1 # 其实就是栈
elif a[i] == ')':
if cnt == 0: r.append(i)
else: cnt -= 1
la = list(a)
for i in r[::-1]: la.pop(i)
n = len(la)
cnt = 0
l = [] # 多余的左括号下标
for i in range(n):
if la[n - 1 - i] == ')': cnt += 1
elif la[n - 1 - i] == '(':
if cnt == 0: l.append(n - 1 - i)
else: cnt -= 1
for i in l: la.pop(i)
a = ''.join(la) # 转换回字符串
print(eval(a)) 相较于原来的代码修改了第十一行:
for i in r:la.pop(i) for i in r[::-1]: la.pop(i)
再提高一下鲁棒性
a = input().replace('^', '**')
a = a.replace('/', '//')
a = a.replace(' ', '')
a = a.replace('()', '')
cnt = 0
r = [] # 多余的右括号下标
for i in range(len(a)):
if a[i] == '(': cnt += 1 # 其实就是栈
elif a[i] == ')':
if cnt == 0: r.append(i)
else: cnt -= 1
la = list(a)
for i in r[::-1]:
la.pop(i)
n = len(la)
cnt = 0
l = [] # 多余的左括号下标
for i in range(n):
if la[n - 1 - i] == ')': cnt += 1
elif la[n - 1 - i] == '(':
if cnt == 0: l.append(n - 1 - i)
else: cnt -= 1
for i in l:
la.pop(i)
a = ''.join(la) # 转换回字符串
print(eval(a)) 
京公网安备 11010502036488号