敢教日月换新天。为有牺牲多壮志,

[Swift]LeetCode224. 基本计算器 | Basic Calculator

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

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

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 }
复制代码

 

posted @   为敢技术  阅读(654)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示
哥伦布
09:09发布
哥伦布
09:09发布
3°
多云
东南风
3级
空气质量
相对湿度
47%
今天
中雨
3°/15°
周三
中雨
3°/13°
周四
小雪
-1°/6°