最近,我得到了一个面试问题,即将"1 + 2-3"和"-2 + 4"等字符串表达式分别转换为0和2.假设输入是单位数字后跟符号而没有NULL输入.我试过这个输出,但面试官说我很接近但不是完美的解决方案.请帮帮我.谢谢.
def ans(input):
result, j = 0, 0
for i in input:
if i == '+' or i == '-':
j = i
else:
i = int(i)
result = result j i
return result
ans("1+2-3")
ans("-2+4")
Run Code Online (Sandbox Code Playgroud)
我犯了一些愚蠢的错误,但我正在学习.提前致谢.
有两件事需要修复才能完成:
您需要正确处理初始值; 当初始值为非负值时,此操作失败.在循环之前,设置j = '+'为添加一个非符号前缀值(对于样式点,j也是一个可怕的名称,你可以使用op什么?).
您不能将变量用作运算符.
更换:
result = result j i
Run Code Online (Sandbox Code Playgroud)
有:
if j == '+':
result += i
else:
result -= i
Run Code Online (Sandbox Code Playgroud)
注意:如果允许模块,可以使用泛化来以"好"的方式处理运算符(尽管需要更多的工作来遵守运算符优先级).你定义:
import operator
ops = {'+': operator.add, '-': operator.sub, ...}
Run Code Online (Sandbox Code Playgroud)
然后创建初始值op operator.add并将运算符的测试更改为:
if i in ops:
op = ops[i]
else:
result = op(result, int(i))
Run Code Online (Sandbox Code Playgroud)
它可以扩展到更多的操作员,动态选择要执行的操作而无需级联if/ elif检查.
旁注:虽然违反了挑战的精神,ast.literal_eval(至少从Python 3.5开始,这可能会改变,请参阅错误#22525)实际上会安全地解析这样的字符串(eval不安全,因为它可以执行任意代码,但ast.literal_eval可以只解析Python文字,显然是一些基本的编译时数学).所以你可以这样做:
import ast
ans = ast.literal_eval
Run Code Online (Sandbox Code Playgroud)
当然,它也处理许多其他文字,但我们从未定义过失败案例行为.:-)