美文网首页
IOS 算法(中级篇) ----- 基本计算器II

IOS 算法(中级篇) ----- 基本计算器II

作者: ShawnAlex | 来源:发表于2021-03-12 09:19 被阅读0次

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。

  1. 1 <= s.length <= 3 * 105
  2. s 由整数和算符 '+', '-', '*', '/' 组成,中间由一些空格隔开
  3. s 表示一个 有效表达式
  4. 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
  5. 题目数据保证答案是一个 32-bit 整数

例子:

输入:s = "3+2*2"
输出:7

输入:s = " 3/2 "
输出:1

输入:s = " 3+5 / 2 "
输出:5

解题思路:

栈方法

IOS 算法(困难篇) ----- 基本计算器类似, 依旧使用栈方法进行处理

数字进入栈
乘除将计算完数字进入栈
最后计算栈中元素之和

代码:

未翻译版

    var ops = [String](), num = ""
    
    func calculate(_ s: String) -> Int {
        
        let temp = s.replacingOccurrences(of: " ", with: "")
        
        for i in temp {
            
            if i == "+" {
                
                cal()
                
            }else if i == "-" {
                
                cal()
                num += "-"
                
            }else if i == "*" {
                
                cal()
                ops.append("*")
                
            }else if i == "/" {
                
                cal()
                ops.append("/")
                
            }else {
                
                num += String(i)
            
            }
        }
        
        cal()
        
        var result = 0
        
        for i in ops {
            result += Int(i) ?? 0
        }
        
        return result
    }
    
    func cal() {
        
        if ops.last == "*" {
           
            ops.removeLast()
            let mul1 = Int(ops.removeLast()) ?? 0, mul2 = Int(num) ?? 0
            num = String(mul1 * mul2)

        }else if ops.last == "/" {
          
            ops.removeLast()
            let div1 = Int(ops.removeLast()) ?? 0, div2 = Int(num) ?? 0
            num = String(div1 / div2)
            
        }
        
        ops.append(num)
        num = ""
    }
翻译版
    // 定义栈数组, num为数字容器 
    var ops = [String](), num = ""
    
    func calculate(_ s: String) -> Int {
        
        // temp为s去空格之后字符串
        let temp = s.replacingOccurrences(of: " ", with: "")
        // 循环
        for i in temp {
            
            if i == "+" {
                // 数字入栈
                cal()
                
                
            }else if i == "-" {
                // 数字入栈, num初始置为负"-"
                cal()
                num += "-"
                
            }else if i == "*" {
                // 数字入栈, 乘法多拼接 "*"
                cal()
                ops.append("*")
                
            }else if i == "/" {
                // 数字入栈, 乘法多拼接 "/"
                cal()
                ops.append("/")
                
            }else {
                // 普通情况数字拼接
                num += String(i)
            
            }
        }
        // 最后剩余数字入栈
        cal()
        
        // 计算栈中元素和即最后结果
        var result = 0
        for i in ops {
            result += Int(i) ?? 0
        }

        //返回结果
        return result
    }
    
    // 公共方法 ops栈中添加数字
    func cal() {
        
        if ops.last == "*" {

            // 如果末尾是 * , 先计算乘法之后再入栈
            // 移出" * "
            ops.removeLast()
            // 和之前元素做乘法
            let mul1 = Int(ops.removeLast()) ?? 0, mul2 = Int(num) ?? 0
            num = String(mul1 * mul2)

        }else if ops.last == "/" {
          
            // 如果是 / 先计算除法之后再入栈
            // 移出" / "
            ops.removeLast()
            // 和之前元素做除法
            let div1 = Int(ops.removeLast()) ?? 0, div2 = Int(num) ?? 0
            num = String(div1 / div2)
            
        }
        
        // 数字入栈, 之后num至空字符串
        ops.append(num)
        num = ""
        
    }

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

相关文章

网友评论

      本文标题:IOS 算法(中级篇) ----- 基本计算器II

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