LeetCode 224. 基本计算器 - 解决负号处理问题
LeetCode 224. 基本计算器 - 解决负号处理问题
在 LeetCode 第 224 题 '基本计算器' 中,我们遇到了一个常见的问题:如何正确处理括号内的负号。当遇到 -(-2)+4 这样的表达式时,原始代码无法识别出括号内的负号,导致计算结果错误。
问题分析
问题出在对于括号内的表达式进行计算时,没有考虑到括号内的表达式可能是负数的情况。
解决方案
为了解决这个问题,我们需要在处理括号内的表达式时,引入一个变量来记录当前的符号,初始值为 1。遇到 '+' 时,符号为 1,遇到 '-' 时,符号为 -1。这样在计算括号内的表达式时,就可以根据当前的符号来进行计算。
同时,要注意在计算括号内的表达式后,需要更新左括号的位置,以便下一次计算括号内的表达式。
优化后的代码
class Solution {
func calculate(_ s: String) -> Int {
var chars = [Character]()
var leftParentheses = [Int]()
var sign = 1 // 当前符号,默认为1
for ch in s {
if ch.isNumber || ch == '+' || ch == '-' || ch == '(' {
chars.append(ch)
if ch == '(' {
leftParentheses.append(chars.count - 1)
} else if ch == '-' && chars.count > 1 && chars[chars.count - 2] == '(' {
sign = -1 // 当遇到括号后的负号,更新当前符号为-1
}
} else if ch == ')' {
let from = leftParentheses.removeLast() + 1
var str = String(chars[from...])
chars.removeLast(str.count + 1)
str = internerCalculate(str, sign)
if str.first! == '-' && !chars.isEmpty {
str.removeFirst()
let lastSymbol = chars.removeLast()
if lastSymbol == '-' {
chars.append('+')
} else {
chars.append('-')
}
}
chars.append(contentsOf: str)
sign = 1 // 恢复当前符号为1
}
}
return Int(internerCalculate(String(chars), 1))!
}
private func internerCalculate(_ expression: String, _ sign: Int) -> String {
var ans = 0
var str = ''
for ch in expression {
if ch == '+' {
ans += sign * Int(str)!
str = ''
} else if ch == '-' {
ans += sign * Int(str)!
str = '-'
} else {
str.append(ch)
}
}
ans += sign * Int(str)!
return '(ans)'
}
}
现在,对于输入 -(-2)+4,返回的结果是 6,与预期结果相符。
总结
通过引入符号变量来记录当前的符号,并对括号内的表达式进行符号处理,我们成功解决了 LeetCode 224 题中遇到的负号问题。在处理类似问题时,要仔细分析符号变化,并选择合适的算法来应对符号带来的影响。
原文地址: https://www.cveoy.top/t/topic/qjC8 著作权归作者所有。请勿转载和采集!