每周 ARTS 第 10 期

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 模型的演化歷史,問題驅動模型的演化,每種模型都有各自的使用場景。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容