题目:
考察内容:
滑动窗口+ eval()
思路:先把合法字符提取出来;再从合法字符提取出合法表达式;再获取最长字符串,并运算最后结果。
代码:
"""
analyze:
如果没有,返回0
数学表达式包括,0-9;+-*
要求:最长(字符串);合法
一个数字不是算法表达式操作符不能连续出现input:
stroutput:
最长合法简单数学表达式eg:
1-2a1bc--3+*d-*3-6
[1-2, 1, --3+*, -*3-6]
['1-2', '1', '-3', '3-6']0-ac1*6-4*3+s-1*2abdd13456
way
先把合法字符提取处理
再处理合法表达式re:
第一个可以为+/, 次数0/1
第二个必须为数字, 数字后面可以跟1-n个数字;
第三个为+/-/* 数字(1-n)
"""
input_str = input()legal_numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
legal_char = ["+", "-", "*"]
legal = legal_char + legal_numbers
res = list()
left, right = 0, 0
for i in range(len(input_str)):if input_str[i] in legal:right = right + 1if i == len(input_str)-1:res.append(input_str[left:right])else:# print(left, right)res.append(input_str[left:right])left = right + 1right = left# print(res)def check_validity_no_regex(s):"""检查表达式是否合法:param s::return:"""flag = Falseprevious_char = None# 判断表达式是否包含[+,-,*]for char in legal_char:if char in s:flag = True# 判断表达式中是否出现连续符合for char in s:if char in legal_char and previous_char in legal_char:flag = Falsereturn flagprevious_char = charreturn flagtemp = list()
for i in res:# 剔除空字符串if len(i) == 0:continue# 判断表达式是否合法result = check_validity_no_regex(i)if result:# 防止表达式最后一个字符为运算字符if i[-1] in legal_char:temp.append(i[:-1])else:temp.append(i)# print(temp)
if temp:expression = max(temp, key=len)print(expression, eval(expression))
else:print("kong")