題目:
根據逆波蘭表示法,求表示式的值。
有效的運算子包括 +, -, *, / 。每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。
說明:
示例 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
題目中給定的字串為有效的逆波蘭表示式, 在進行計算之前首先要解決兩個問題:
通過分析之後,將主要解決問題劃分為3個子問題進行處理:
判斷字串是否為數字
此問題不能簡單的通過呼叫isalnum來判斷,因為一旦出現兩位數「10」,或者負數「-1」,將不能判斷
數字字串轉為int型別數字計算
在解決這些問題後,就可以進行對逆波蘭表示式的計算過程
class
solution
}return
false;}
// 數字字串轉int數字
intstrtonum
(string &str)
}else
}return negative?
-res: res;
}// 計算
intcaculate
(int
&a,int
&b,char operat)
return res;
}int
evalrpn
(vector
& tokens)
stack<
int> st;
for(
int i =
0; i < tokens.
size()
; i++
)else
}return st.
top();
}};
題目:
給定乙個二叉樹,返回它的 前序 遍歷。
示例:
輸入:[
1,null,2,
3]1 \
2/3
輸出:[1,
2,3]
作為一道基礎的二叉樹問題,遞迴的解法自然不同多說。
從題目本質的性質來說,二叉樹的前序遍歷,中序遍歷以及後序遍歷都屬於深度優先搜尋演算法的一種變形形式,正因如此,才要一定使用棧的結構來儲存父節點的資料,以此達到類似於路徑搜尋的目的。
另外,前序遍歷的順序為根->左子樹->右子樹,這就意味著棧首先壓入根節點,再壓入左子樹節點,再壓入右子樹節點。
至此,迭代方式來完成二叉樹的前序遍歷的準備工作已經完成。
class
solution
// 左子樹的「左節點」遍歷結束,之後開始遍歷左子樹的「右節點」
// 同理,當左子樹遍歷結束,開始遍歷右子樹;
// 之後,右子樹的「最左節點」,每乙個左節點的左右子樹,以此類推
root = st.
top();
st.pop();
root = root-
>right;
}return res;}}
;
題目:
給定乙個二叉樹,返回它的中序 遍歷。
示例:
輸入:[
1,null,2,
3]1 \
2/3輸出:[1,
3,2]
中序遍歷的順序為左子樹->根節點->右子樹,從前序遍歷的方法中可以大致推導出基本框架為:
while
(root || st.
size()
)// while結束,表明已經抵達該子樹的「最左」節點,目前棧頂元素就是「最左」節點的位址
// 毫無疑問,「最左節點」的左右子樹均為null
root = st.
top();
st.pop();
res.
push_back
(root-
>val)
;// 正因「最左節點」的左右子樹均為null,且「最左節點」已經確定,因此「最左節點」的右子樹,就成了「回溯」的關鍵條件
root = root-
>right;
}
一句話來總結,就是不斷確定目前節點的「最左節點」,並以「最左節點」的右子樹是否為null為回溯的條件。
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
root = st.
top();
st.pop();
res.
push_back
(root-
>val)
; root = root-
>right;
}return res;}}
;
刷題計畫 雙指標演算法(一)
leetcode上的一些能用雙指標辦法解決的演算法題題解 86.分割鍊錶 中等 題目 給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3輸出 1 2 ...
演算法題目刷題 第三題,反轉棧只用遞迴函式
題目 乙個棧依次壓入1,2,3,4,5,那麼從棧頂部到棧底部分別為5,4,3,2,1.將這個棧轉置後,從棧頂到棧底為1,2,3,4,5.也就是實現棧中元素的逆序,但是只能用遞迴函式來實現,不能用其他資料結構。思路 這個題目用了遞迴函式的思想,本來遞迴函式底層就是棧結構實現的。用圖私下做出函式遞迴呼叫...
LeetCode C 刷題計畫 15 三數之和
author csu張揚 email csuzhangyang gmail.com or csuzhangyang qq.com category difficulty pass rate br algorithms medium 24.31 array two pointers adobe ama...