1. Algorithm
226. 翻轉二叉樹(簡單)
描述:
翻轉一棵二叉樹
示例:
示例:
輸入:
4
2 7
1 3 6 9
輸出:
4
7 2
9 6 3 1
思路:
- 遞歸法:翻轉一個二叉樹,就是把根節(jié)點的左子樹翻轉一下,同樣的把右子樹翻轉一下,再交換左右子樹就可以了。
- 迭代法:類似廣度優(yōu)先遍歷的方式,使用隊列存儲尚未交換的節(jié)點,每次從隊列取出一個結點,交互其左右子結點,直到隊列為空。
class Solution {
public TreeNode invertTreeRecursively(TreeNode root) {
if (root == null) {
return null;
}
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
invertTreeRecursively(root.left);
invertTreeRecursively(root.right);
return root;
}
public TreeNode invertTreeIteratively(TreeNode root) {
if (root == null) {
return null;
}
LinkedList<TreeNode> list = new LinkedList<>();
list.add(root);
while (list.isEmpty()) {
TreeNode current = list.poll();
TreeNode temp = current.left;
current.left = current.right;
current.right = temp;
if (current.left != null) {
list.add(current.left);
}
if (current.right != null) {
list.add(current.right);
}
}
return root;
}
}
分析:
遞歸和迭代法一樣:
- 時間復雜度:O(n)
- 空間復雜度:O(n)
326. 3 的冪(簡單)
描述:
給定一個整數(shù),寫一個函數(shù)來判斷它是否是 3 的冪次方。
示例:
輸入: 27
輸出: true
思路:
- 解法一:累乘法
- 解法二:3的冪次質因子只有3,而整數(shù)范圍內的3的冪次最大是1162261467
解法:
class Solution {
public boolean isPowerOfThree(int n) {
if (n <= 0) {
return false;
}
if (n == 1) {
return true;
}
long m = 1;
while (m < n) {
m *= 3;
if (m == n) {
return true;
}
}
return false;
}
public boolean isPowerOfThree2(int n) {
return n > 0 && 1162261467 % n == 0;
}
}
分析:
解法一:
- 時間復雜度:O(n)
- 空間復雜度:O(1)
解法二:
- 時間復雜度:O(1)
- 空間復雜度:O(1)
2. Review
Goodbye, Object Oriented Programming 再見,面向對象編程
作者是個有著多年經驗的老程序員,他毫不留情地指出了面向對象編程的問題,分別從封裝、繼承和多態(tài)這三大支柱來闡述。
- 繼承最大的好處就是復用。但是出現(xiàn)了「猴子香蕉叢林」問題,我只想要一根香蕉,得到的卻是香蕉叢林。鉆石問題,繼承關系的結構圖就像鉆石一樣,這樣容易造成調用混亂。還有基類問題,子類不知道基類的實現(xiàn),從而引發(fā)操作錯誤。解決辦法就是用組合替代繼承,原意是包含和委托。
- 封裝使得對象保證內部的變量受保護,然而它卻帶來了一下問題。引用問題,給構造方法傳參時,對象存在多個應用,這樣對象就不安全了。解決辦法是對象深拷貝,但不是所有對象都支持克隆。
- 面向對象編程不需要多態(tài),它完全可以基于接口來實現(xiàn)。
最后作者告別了面向對象編程,轉向函數(shù)式編程。
雖然作者舉出這么多 OOP 的問題,但是面向對象的思想依然非常流行。軟件開發(fā)沒有銀彈,能夠實現(xiàn)功能、解決問題的思想都是值得采用的。
3. Tip
日常的瑣事都用軟件記錄,比如有道云筆記、滴答清單、LastPass。大腦是用來思考的,不是用來記東西的,它充當?shù)母嗍?CPU 的角色,而不是硬盤。所以,讓大腦輕松一下,用工具記錄吧。
4. Share
關于線程和I/O模型的極簡知識 主要講述了線程和 I/O 模型的演化歷史,問題驅動模型的演化,每種模型都有各自的使用場景。