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 题中遇到的负号问题。在处理类似问题时,要仔细分析符号变化,并选择合适的算法来应对符号带来的影响。

LeetCode 224. 基本计算器 - 解决负号处理问题

原文地址: https://www.cveoy.top/t/topic/qjC8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录