目錄
- 逆波蘭表達式求值
- 合并兩個有序鏈表 <==> 類似于合并兩個有序數組
- 合并 k 個排序鏈表,返回合并后的排序鏈表
- 驗證二叉搜索樹
- 二叉樹的前中后層序遍歷
- 二叉樹中的最大路徑和
- 二叉樹展開為鏈表
- 打家劫舍
- 前 K 個高頻元素
題目 1.逆波蘭表達式求值
150: 根據逆波蘭表示法,求表達式的值。
有效的運算符包括 +, -, *, / 。每個運算對象可以是整數,也可以是另一個逆波蘭表達式。
- 整數除法只保留整數部分。
- 給定逆波蘭表達式總是有效的。換句話說,表達式總會得出有效數值且不存在除數為 0 的情況。
示例 1:
輸入: ["2", "1", "+", "3", "*"]
輸出: 9
解釋: ((2 + 1) * 3) = 9
示例 2:
輸入: ["4", "13", "5", "/", "+"]
輸出: 6
解釋: (4 + (13 / 5)) = 6
示例 3:
輸入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
輸出: 22
解釋:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
思路
思路示意圖
代碼
import Foundation
//判斷是否是操作符
func isOperator(string: String) -> Bool {
return ("+-*/" as NSString).contains(string)
}
// 計算每一項的結果: 左操作數 操作符 右操作數 = 值
func calculate(left: Int, right: Int, operatorStr: String) -> Int {
switch operatorStr {
case "+":
return left + right
case "-":
return left - right
case "*":
return left * right
case "/":
return left / right
default:
return 0
}
}
//返回逆波蘭表達式的值 時間復雜度O(n)
func evalRPN(tokens: [String] ) -> Int? {
//數組 模擬 棧
var stack: [Int] = [];
for string in tokens {
//操作符
if isOperator(string: string) {
// 右操作數
let right = stack.last
//出棧
stack.removeLast();
// 左操作數
let left = stack.last;
//出棧
stack.removeLast();
//把計算結果入棧
let value = calculate(left: left!, right: right!, operatorStr: string);
stack.append(value);
}else {
//入棧
stack.append(Int(string)!)
}
}
return stack.first
}
// 輸入的逆波蘭表達式
let input = ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
let value = evalRPN(tokens: input)
print("逆波蘭表達式 \(input) \n值:\(value ?? 0)")
推薦學習資料:
如果需要跟我交流的話:
※ Github: https://github.com/wsl2ls
※ 簡書:http://www.lxweimin.com/u/e15d1f644bea
※ 微信公眾號:iOS2679114653
※ QQ群:835303405