美文网首页
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