美文网首页
IOS 算法(困难篇) ----- 基本计算器

IOS 算法(困难篇) ----- 基本计算器

作者: ShawnAlex | 来源:发表于2021-03-11 13:55 被阅读0次

    给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

    1. 1 <= s.length <= 3 * 10 ^5
    2. s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
    3. s 表示一个有效的表达式

    例子

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

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

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

    解题思路

    栈方法

    通过栈特性, 后进先出进行处理

    例如:

    s = "(1+(4+5+2)-3)+(6+8)", 栈数组ops = [], 数字容器 num = "", 符号sign = 1, 结果result = 0
    **ops: **依次存储上一次和元素, sign
    **num: **用来存当前数字, 多位依次拼接
    **result: **存上一次和
    **sign: **符号

    第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 = ""
            
        }
    
    翻译版
        // 定义栈数组, 正负标识sign, num为数字容器, 结果result
        // 栈数组用来储存当前 和/差结果以及符号
        var ops = [Int](), sign = 1, num = "", result = 0
        
        func calculate(_ s: String) -> Int {
            
            // 定义temp为去除空字符串之后的s
            let temp = s.replacingOccurrences(of: " ", with: "")
            
            // 循环temp
            for i in temp {
                
                if i == "(" {
                    
                    // 如果为"(", 先求和
                    calNum(num)
                    // ops存之前的和
                    ops.append(result)
                    // 存当前符号 +/-
                    ops.append(sign)
                    // 结果置0 
                    result = 0
                    // sign置1
                    sign = 1
    
                }else if i == ")" {
                    
                    // 如果为")", 先求和 
                    calNum(num)
                    // 乘之前符号 
                    result *= ops.removeLast()
                    // 加上之前和
                    result += ops.removeLast()
                    
                }else if i == "+" {
    
                    // 如果为"+", 先求和 
                    calNum(num)
                    // sign置1, 正
                    sign = 1
                    
                }else if i == "-" {
                    
                    // 如果为"-", 先求和 
                    calNum(num)
                    // sign置-1, 负
                    sign = -1
                    
                }else {
    
                    // 如果是数字, num依次拼接i
                    num.append(i)
                }
                
            }
    
            // 循环结束, 求和最后的num
            calNum(num)
    
            // 返回结果
            return result
            
        }
        
        // 公用方法, 主要用来计算
        func calNum(_ i: String) {
        
            let nums = Int(i) ?? 0
            result += nums * sign
            num = ""
            
        }
    

    题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
    IOS 算法合集地址

    相关文章

      网友评论

          本文标题:IOS 算法(困难篇) ----- 基本计算器

          本文链接:https://www.haomeiwen.com/subject/yannqltx.html