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/ /'