题目:
考察内容:
滑动窗口+ eval()
思路:先把合法字符提取出来;再从合法字符提取出合法表达式;再获取最长字符串,并运算最后结果。
代码:
"""
analyze:
如果没有,返回0
数学表达式包括,0-9;+-*
要求:最长(字符串);合法
一个数字不是算法表达式
操作符不能连续出现
input:
str
output:
最长合法简单数学表达式
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 + 1
if i == len(input_str)-1:
res.append(input_str[left:right])
else:
# print(left, right)
res.append(input_str[left:right])
left = right + 1
right = left
# print(res)
def check_validity_no_regex(s):
"""
检查表达式是否合法
:param s:
:return:
"""
flag = False
previous_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 = False
return flag
previous_char = char
return flag
temp = 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")