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

[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 @ 2019-01-01 10:34  为敢技术  阅读(653)  评论(0编辑  收藏  举报