1. 程式人生 > >[Swift]LeetCode224. 基本計算器 | Basic Calculator

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

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 }