题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
#输入有其它括号,换成()
equation = list(map(str,input().replace('[','(').replace(']',')').replace('{','(').replace('}',')')))
new_equation = []
for i in range(len(equation)):
if i == 0:
new_equation.append(equation[i])
else:
if equation[i].isdigit():
if new_equation[-1].isdigit():
new_equation[-1] += equation[i]
else:
new_equation.append(equation[i])
else:
new_equation.append(equation[i])
equation = new_equation
#统计多少个括号
brackets = 0
for i in equation:
if i == "(":
brackets += 1
#寻找最内层的括号/是里面没有别的括号的括号
def find_inner_bracket(equation):
bracket_index = []
for i in range(len(equation)):
if equation[i] == "(":
for j in range(i+1, len(equation)):
if equation[j] == "(":
break
elif equation[j] == ")":
if len(bracket_index) == 0:
bracket_index.append(i)
bracket_index.append(j)
break
return bracket_index
#嵌套的无括号表达式计算
def calculate_without_bracket(sub_s):
nums = []
for j in range(len(sub_s)):
#先读入第一个
if j == 0:
if sub_s[j].isdigit():
nums.append(int(sub_s[j]))
else:
continue
else:
if sub_s[j-1] == "+":
nums.append(int(sub_s[j]))
elif sub_s[j-1] == "-":
nums.append(-int(sub_s[j]))
elif sub_s[j-1] == "*":
nums[-1] = nums[-1] * int(sub_s[j])
elif sub_s[j-1] == "/":
nums[-1] = nums[-1] // int(sub_s[j])
return str(sum(nums))
#对最内层()内的表达式进行计算
def calculate_with_bracket(bracket_range, equation):
s_braket = bracket_range
# for i in range(len(equation)):
# if equation[i] == x:
# s_braket.append(i)
# elif equation[i] == y:
# s_braket.append(i)
if len(s_braket) != 0:
for i in range(0, len(s_braket), 2):
#进行括号内计算
sub_s = equation[s_braket[i]+1: s_braket[i+1]]
# print(sub_s)
sub_res = calculate_without_bracket(sub_s)
#得到结果后删除括号及括号内表达式并插入结果
del equation[s_braket[i]:s_braket[i+1]+1]
equation.insert(s_braket[i], sub_res)
return equation
#计算:共循环括号个数次
for i in range(brackets):
# print(equation)
bracket_range = find_inner_bracket(equation)
# print(bracket_range)
equation = calculate_with_bracket(bracket_range, equation)
if len(equation) == 1:
res = equation[0]
print(res)
else:
# print(equation)
res = calculate_without_bracket(equation)
print(res)
#eval()
# # s = input()
# # s = s.replace("{", "(")
# # s = s.replace("}", ")")
# # s = s.replace("[", "(")
# # s = s.replace("]", ")")
# # print(int(eval(s)))
本质上也是递归思想,(新人代码写的比较丑见谅):
A.预处理:
首先把{}和[]都转换成()预处理;
把连续的数字也就是多位数字(大于等于两位的数字)合并成list当中的一项构建新的字符list;
统计括号的个数,通过数有多少个"(",确定循环(递归)次数。
B.正式处理:
在当前递归循环中,寻找list中最内层的括号(即括号内没有其它括号的括号)的起止index,在最左端的优先,每次只处理一个最内层括号内的表达式
计算完成后,删除list中包括该最内层括号以及其起止范围内的表达式对应的字符,将计算结果插入该括号的起点位置,得到要在下一轮中进行计算的新的list
C.结果判定:
if:范例输入的整个表达都是在括号内,则以上计算结果输出的list只有一个字符元素,即结果,转格式输出
else:再进行一次无括号计算,输出结果
整个逻辑感觉可以归纳为更加精简的递归格式,欢迎批评!
#每天刷题#
查看12道真题和解析