IOS 算法(困難篇) ----- 基本計(jì)算器

給你一個(gè)字符串表達(dá)式 s ,請(qǐng)你實(shí)現(xiàn)一個(gè)基本計(jì)算器來(lái)計(jì)算并返回它的值。

  1. 1 <= s.length <= 3 * 10 ^5
  2. s 由數(shù)字、'+'、'-'、'('、')'、和 ' ' 組成
  3. s 表示一個(gè)有效的表達(dá)式

例子

輸入:s = "1 + 1"
輸出:2

輸入:s = " 2-1 + 2 "
輸出:3

輸入:s = "(1+(4+5+2)-3)+(6+8)"
輸出:23

解題思路

棧方法

通過(guò)棧特性, 后進(jìn)先出進(jìn)行處理

例如:

s = "(1+(4+5+2)-3)+(6+8)", 棧數(shù)組ops = [], 數(shù)字容器 num = "", 符號(hào)sign = 1, 結(jié)果result = 0
**ops: **依次存儲(chǔ)上一次和元素, sign
**num: **用來(lái)存當(dāng)前數(shù)字, 多位依次拼接
**result: **存上一次和
**sign: **符號(hào)

第1次: "(", ops = [0, 1], result = 0, sign = 1, num = ""
第2次: "1", ops = [0, 1], result = 0, sign = 1, num = "1"
第3次: "+", ops = [0, 1], result = 1, sign = 1, num = ""
第3次: "(", ops = [0, 1], result = 1, sign = 1, num = ""
第4次: "+", ops = [0, 1, 1, 1], result = 0, sign = 1, num = ""
第5次: "4", ops = [0, 1, 1, 1], result = 0, sign = 1, num = "4"
第6次: "+", ops = [0, 1, 1, 1], result = 4, sign = 1, num = ""
第7次: "5", ops = [0, 1, 1, 1], result = 4, sign = 1, num = "5"
第8次: "+", ops = [0, 1, 1, 1], result = 9, sign = 1, num = ""
第9次: "2", ops = [0, 1, 1, 1], result = 9, sign = 1, num = "2"
第10次: ")", ops = [0, 1], result = 12, sign = 1, num = ""
第11次: "-", ops = [0, 1], result = 12, sign = -1, num = ""
第12次: "3", ops = [0, 1], result = 12, sign = -1, num = "3"
第13次: ")", ops = [], result = 9, sign = 1, num = ""
第14次: "+", ops = [], result = 9, sign = 1, num = ""
第15次: "(", ops = [9, 1], result = 0, sign = 1, num = ""
第16次: "6", ops = [9, 1], result = 0, sign = 1, num = "6"
第17次: "+", ops = [9, 1], result = 6, sign = 1, num = ""
第18次: "8", ops = [9, 1], result = 6, sign = 1, num = "8"
第19次: ")", ops = [], result = 23, sign = 1, num = ""

未翻譯版
    
    var ops = [Int](), sign = 1, num = "", result = 0
    
    func calculate(_ s: String) -> Int {
        
        let temp = s.replacingOccurrences(of: " ", with: "")

        for i in temp {
            
            if i == "(" {
                
                calNum(num)
                ops.append(result)
                ops.append(sign)
                result = 0
                sign = 1
                
            }else if i == ")" {
                
                calNum(num)
                result *= ops.removeLast()
                result += ops.removeLast()
                
            }else if i == "+" {
                
                calNum(num)
                sign = 1
                
            }else if i == "-" {
                
                calNum(num)
                sign = -1
                
            }else {
                num.append(i)
            }
            
        }
        
        calNum(num)
        
        return result
        
    }
    
    func calNum(_ i: String) {
        
        let nums = Int(i) ?? 0
        result += nums * sign
        num = ""
        
    }
翻譯版
    // 定義棧數(shù)組, 正負(fù)標(biāo)識(shí)sign, num為數(shù)字容器, 結(jié)果result
    // 棧數(shù)組用來(lái)儲(chǔ)存當(dāng)前 和/差結(jié)果以及符號(hào)
    var ops = [Int](), sign = 1, num = "", result = 0
    
    func calculate(_ s: String) -> Int {
        
        // 定義temp為去除空字符串之后的s
        let temp = s.replacingOccurrences(of: " ", with: "")
        
        // 循環(huán)temp
        for i in temp {
            
            if i == "(" {
                
                // 如果為"(", 先求和
                calNum(num)
                // ops存之前的和
                ops.append(result)
                // 存當(dāng)前符號(hào) +/-
                ops.append(sign)
                // 結(jié)果置0 
                result = 0
                // sign置1
                sign = 1

            }else if i == ")" {
                
                // 如果為")", 先求和 
                calNum(num)
                // 乘之前符號(hào) 
                result *= ops.removeLast()
                // 加上之前和
                result += ops.removeLast()
                
            }else if i == "+" {

                // 如果為"+", 先求和 
                calNum(num)
                // sign置1, 正
                sign = 1
                
            }else if i == "-" {
                
                // 如果為"-", 先求和 
                calNum(num)
                // sign置-1, 負(fù)
                sign = -1
                
            }else {

                // 如果是數(shù)字, num依次拼接i
                num.append(i)
            }
            
        }

        // 循環(huán)結(jié)束, 求和最后的num
        calNum(num)

        // 返回結(jié)果
        return result
        
    }
    
    // 公用方法, 主要用來(lái)計(jì)算
    func calNum(_ i: String) {
    
        let nums = Int(i) ?? 0
        result += nums * sign
        num = ""
        
    }

題目來(lái)源:力扣(LeetCode) 感謝力扣爸爸 :)
IOS 算法合集地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容