看到各位大佬的恐怖码量,相信一定有人和本菜鸡一样不寒而栗:
看到这种题,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))