Dimple在左耳聽風ARTS打卡(二十二)

  • 2019 年 12 月 25 日
  • 筆記

這周身體有點抱恙,扛過炎熱的7月,沒想到在8月之初,竟然華麗麗的中暑,哈哈。好在還沒想過放棄打卡,等哪天想放棄了,估計還有點捨不得。

最近開始學習《從零開始學架構》,恰逢剛好在找英文資料的時候,給我推薦了一篇2017年寫的簡要描述10個通用的軟體架構。

這個世界有時候就是這個奇妙,你想學什麼,你身邊的資源都會無形之中向你靠近。

Algorithm LeetCode演算法

翻轉二叉樹 (https://leetcode-cn.com/problems/invert-binary-tree/)

題目描述:翻轉一棵二叉樹。這是我學習二叉樹系列,我想做的最後一道簡單題了,畢竟這麼多次,大家也看到了二叉樹的套路,所以這次和大家再做一個簡單的題,就算熟悉結束了。

下次,應該還會死磕二叉樹,然後做難度大的題。這就是學生時代沒有努力的結果,現在在不停地惡補中。

示例:

輸入:         4     /       2     7   /    /   1   3 6   9

輸出:         4     /       7     2   /    /   9   6 3   1

這次,我先把準備工作給做了,把二叉樹先生成。

public static void main(String[] args) {      TreeNode root = new TreeNode(4);      root.left = new TreeNode(2);      root.right = new TreeNode(7);        root.left.left = new TreeNode(1);      root.left.right = new TreeNode(3);        root.right.left = new TreeNode(6);      root.right.right = new TreeNode(9);      TreeNode result = invertTree(root);      System.out.println(result);  }

方法一: 還是使用遞歸。對於一顆二叉樹來說,如果根是root,左子樹是left,右子樹是right;那反轉過來就是根不變,左子樹成right,右子樹是left。

通過程式碼來描述,就是把左右子樹互換即可。

public static TreeNode invertTree(TreeNode root) {      if (root == null) {          return null;      }        TreeNode lNode = invertTree(root.left);      TreeNode rNode = invertTree(root.right);      root.left = rNode;      root.right = lNode;      return root;  }

方法二: 迭代

如果用迭代的方式,那我們需要創建一個隊列來存儲所有左子樹和右子樹還沒被交換過的節點。

一開始的時候,只有根節點在這個隊列裡面,只要隊列不為空,就一直從隊列中出節點,然後互換這個節點下的左右子節點。

接著再把子節點入隊到隊列,對於其中的空節點不需要加入隊列,最終隊列一定會為空,此時所有均被互換過,輸出最終結果即可。

public static TreeNode invertTreeQueue(TreeNode root) {      if (root == null) {          return null;      }        Queue<TreeNode> queue = new LinkedList<TreeNode>();      queue.add(root);      while (!queue.isEmpty()) {          TreeNode currentNode = queue.poll();          TreeNode tempNode = currentNode.left;          currentNode.left = currentNode.right;          currentNode.right = tempNode;          if (currentNode.left != null) {              queue.add(currentNode.left);          }            if (currentNode.right != null) {              queue.add(currentNode.right);          }      }      return root;  }

Review 閱讀並點評至少一篇英文文章

10 Common Software Architectural Patterns in a nutshell (https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013)

這是一篇17年的文章,用簡潔明了的方式介紹了10個通用軟體架構模式。剛好最近在看《從零開始學架構》這本書,我就順勢點進去學習學習。感覺自己飄了,程式碼都還寫的不咋滴,竟然又要開始玩架構。

作者也先用維基百解釋了下什麼是架構模式,然後就承上啟下,推出了以下的十個架構模式。很慶幸就在最近讀了《從零開始學架構》,有了點概念,不然還真的有點難。

也是湊巧,我實際行動中的大數據難道也被採集了?我看的是紙質書的架構相關,沒想到著這個網站也給我推薦了,真是及時雨。

  1. Layered pattern
  2. Client-server pattern
  3. Master-slave pattern
  4. Pipe-filter pattern
  5. Broker pattern
  6. Peer-to-peer pattern
  7. Event-bus pattern
  8. Model-view-controller pattern
  9. Blackboard pattern
  10. Interpreter pattern

簡單的學習完,其實我們很多時候都已經在用了部分架構,比如第8個MVC架構,無論是我當初學Android還是學習Java,第一個學習的模式就是MVC的模式。相信很多人也是同感吧。

架構是選擇的一部分,也是鍛煉程式設計師功底很好的試金石,我們能成為優秀的程式設計師,但這還不夠,更進一步,如果是走技術路線,那必然就是架構師了。那,還等什麼,架構就要學習起來了,這就是一篇普及的文,然後平時多多積累,相信我們都可以成為一名合格的架構師。

Tip 一個技術技巧

之前因為Linux學習的問題,所以索性就系統學習下Linux的一些常用命令。前兩期已經學了tail和grep,這次我就簡單的分享下5個常用的命令,同大家一起學習進步。

1.tar

創建一個新的tar文件

$ tar cvf archive_name.tar dirname/

解壓tar文件

$ tar xvf archive_name.tar

查看tar文件

$ tar tvf archive_name.tar
  1. grep

在文件中查找字元串(不區分大小寫)

$ grep -i "the" demo_file

輸出成功匹配的行,以及該行之後的三行

$ grep -A 3 -i "example" demo_text

在一個文件夾中遞歸查詢包含指定字元串的文件

$ grep -r "ramesh" *
  1. find

查找指定文件名的文件(不區分大小寫)

$ find -iname "MyProgram.c"

對找到的文件執行某個命令

$ find -iname "MyProgram.c" -exec md5sum {} ;

查找home目錄下的所有空文件

$ find ~ -empty
  1. ssh

登錄到遠程主機

$ ssh -l jsmith remotehost.example.com

調試ssh客戶端

$ ssh -v -l jsmith remotehost.example.com

顯示ssh客戶端版本

$ ssh -V
  1. sed

當你將Dos系統中的文件複製到Unix/Linux後,這個文件每行都會以rn結尾,sed可以輕易將其轉換為Unix格式的文件,使用n結尾的文件

$ sed 's/.$//' filename

反轉文件內容並輸出

$ sed -n '1!G; h; p' filename

為非空行添加行號

$ sed '/./=' thegeekstuff.txt | sed 'N; s/n/ /'