zoukankan      html  css  js  c++  java
  • [Swift]LeetCode224. 基本计算器 | Basic Calculator

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10204296.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Implement a basic calculator to evaluate a simple expression string.

    The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

    Example 1:

    Input: "1 + 1"
    Output: 2
    

    Example 2:

    Input: " 2-1 + 2 "
    Output: 3

    Example 3:

    Input: "(1+(4+5+2)-3)+(6+8)"
    Output: 23

    Note:

    • You may assume that the given expression is always valid.
    • Do not use the eval built-in library function.

    实现一个基本的计算器来计算一个简单的字符串表达式的值。

    字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格  

    示例 1:

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

    示例 2:

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

    示例 3:

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

    说明:

    • 你可以假设所给定的表达式都是有效的。
    • 请不要使用内置的库函数 eval

    96ms

     1 class Solution {
     2     func calculate(_ s: String) -> Int {
     3         var num = 0
     4         var res = 0
     5         var sign = 1
     6         var stack = [Int]()
     7         var s = Array(s)
     8         for i in 0 ..< s.count {
     9             var c = s[i]
    10             
    11             if c == "+" {
    12                 res += sign*num
    13                 num = 0
    14                 sign = 1
    15             } else if c == "-" {
    16                 res += sign*num
    17                 num = 0
    18                 sign = -1
    19             } else if c == "(" {
    20                 stack.append(res)
    21                 stack.append(sign)
    22                 res = 0
    23                 sign = 1
    24             } else if c == ")" {
    25                 res += sign*num
    26                 num = 0
    27                 res *= stack.removeLast()
    28                 res += stack.removeLast()
    29             } else {
    30                 if let n = Int(String(c)) {
    31                     num = 10*num+n
    32                 }
    33             }
    34         }
    35         
    36         if num != 0 {
    37             res += sign*num
    38         }
    39         return res
    40     }
    41 }

    132ms

     1 class Solution {
     2     func calculate(_ s: String) -> Int {
     3         var res = 0
     4         var num = 0
     5         var sign = 1
     6         var stack = [Int]()
     7         let sArray = Array(s)
     8         
     9         for i in 0..<sArray.count {
    10             if let value = Int(String(sArray[i])) {
    11                 num = num * 10 + value
    12             }else if sArray[i] == "+" || sArray[i] == "-" {
    13                 res += sign * num
    14                 sign = sArray[i] == "+" ? 1 : -1
    15                 num = 0
    16             }else if sArray[i] == "(" {
    17                 stack.append(res)
    18                 stack.append(sign)
    19                 sign = 1
    20                 res = 0
    21             }else if sArray[i] == ")" {
    22                 res += num * sign
    23                 let tmp = res * stack.removeLast()
    24                 res = stack.removeLast() + tmp
    25                 sign = 1
    26                 num = 0
    27             }
    28         }
    29         
    30         return num == 0 ? res : res + sign * num
    31     }
    32 }

    144ms

     1 class Solution {
     2     func calculate(_ s: String) -> Int {
     3         var result = 0
     4         var num = 0
     5         var sign = 1
     6         var equationStack = [Int]()
     7 
     8         for char in s {
     9             if let digit = Int(String(char)) {
    10                 num = 10 * num + digit
    11             } else if char == "+" {
    12                 result += sign * num
    13                 num = 0
    14                 sign = 1
    15             } else if char == "-" {
    16                 result += sign * num
    17                 num = 0
    18                 sign = -1
    19             } else if char == "(" {
    20                 equationStack.append(result)
    21                 equationStack.append(sign)
    22                 sign = 1
    23                 result = 0
    24             } else if char == ")" {
    25                 result += sign * num
    26                 num = 0
    27                 result *= equationStack.removeLast()
    28                 result += equationStack.removeLast()
    29             }
    30         }
    31         if num != 0 { result += sign * num }
    32         return result
    33     }
    34 }

    192ms

     1 class Solution {
     2     func calculate(_ s: String) -> Int {
     3         var res = 0, num = 0, sign = 1, n = s.count
     4         var st = [Int]()
     5         for c in s {
     6             if c == " " { continue }
     7             else if c == "+" || c == "-" {
     8                 res += sign*num
     9                 num = 0
    10                 sign = (c == "+") ? 1: -1
    11             }
    12             else if c == "(" {
    13                 st.append(res)
    14                 st.append(sign)
    15                 res = 0
    16                 sign = 1
    17             }
    18             else if c == ")" {
    19                 res += sign*num
    20                 num = 0
    21                 res *= st.removeLast()
    22                 res += st.removeLast()
    23                 
    24             }
    25             else {
    26                 num = num*10 + Int(String(c))!
    27             }
    28         }
    29                         res += sign*num
    30 
    31         return res
    32     }
    33 }

    196ms

     1 class Solution {
     2     func calculate(_ s: String) -> Int {
     3         let trimmedS = s.trimmingCharacters(in: .whitespaces)
     4         let charArray = [Character](trimmedS)
     5         var stack = [Int]()
     6         var num = 0
     7         var result = 0
     8         var sign = 1
     9         
    10         for i in 0..<charArray.count{
    11          
    12             if let digit = Int(String(charArray[i])){     
    13                 num = num*10 + digit
    14                 if (i < charArray.count - 1 && Int(String(charArray[i + 1])) == nil) || i == charArray.count - 1{
    15                      result += num*sign
    16                 }
    17             }else{
    18                 num = 0
    19                 if charArray[i] == "+"{
    20                     sign = 1
    21                 }else if charArray[i] == "-"{
    22                     sign = -1
    23                 }else if charArray[i] == "("{
    24                     stack.append(result)
    25                     stack.append(sign)
    26                     result = 0
    27                     sign = 1
    28                 }else if charArray[i] == ")"{
    29                     let signBeforeParenthese = stack.removeLast()
    30                     let resultBeforeParenthese = stack.removeLast()
    31                     result =  resultBeforeParenthese + signBeforeParenthese*result
    32                 }else{
    33                     continue
    34                 }
    35             }
    36 
    37         }
    38         return result
    39 
    40     }
    41 }

    344ms

     1 class Solution {
     2     func calculate(_ s: String) -> Int {
     3         var s = Array(s.characters)
     4         var tk_i = 0
     5         func nextToken() -> String? {
     6             if tk_i >= s.count { return nil }
     7             if s[tk_i] == " " {
     8                 tk_i += 1
     9                 return nextToken() 
    10             }
    11             if s[tk_i] >= "0" && s[tk_i] <= "9" {
    12                 var j = tk_i + 1
    13                 while j < s.count && s[j] >= "0" && s[j] <= "9" { j += 1 }
    14                 let ret = String(s[tk_i..<j])
    15                 tk_i = j
    16                 return ret
    17             }
    18             tk_i += 1
    19             return String(s[tk_i - 1])
    20         }
    21         
    22         var stack = [String]()
    23         func eval(_ from: Int, _ to: Int) -> Int {
    24             var ret = Int(stack[from])!
    25             var i = from + 1
    26             while i <= to {
    27                 let opr = stack[i]
    28                 let opnd = Int(stack[i + 1])!
    29                 if opr == "+" {
    30                     ret = ret + opnd
    31                 } else {
    32                     ret = ret - opnd
    33                 }
    34                 i += 2
    35             }
    36             return ret
    37         }
    38             
    39         while let tk = nextToken() {
    40             if tk == ")" {
    41                 var j = stack.count - 1
    42                 while stack[j] != "(" { j -= 1 }
    43                 let res = eval(j + 1, stack.count - 1)
    44                 while stack.count > j { stack.removeLast() }
    45                 stack.append(String(res))
    46             } else {
    47                 stack.append(tk)
    48             }
    49         }
    50         
    51         return eval(0, stack.count - 1)
    52     }
    53 }
  • 相关阅读:
    用AjaxMethod 方法实现动态加载地图
    C#中HashTable的使用(转)
    ArcGIS Server 中的动态文字标注
    ArcGIS Server .Net Web ADF之几何类型的相互转换(转)
    ArcGIS Server连接远程地图服务器
    sqlplus环境配置(login.sql)
    Oracle从软件安装到运行的全流程
    【转载】linux中误删除oracle数据文件的恢复操作
    “大淘宝战略”下集市定位,将决定马云和未来淘宝的命运
    男人如何对待抱怨自己的女人
  • 原文地址:https://www.cnblogs.com/strengthen/p/10204296.html
Copyright © 2011-2022 走看看