每周完成一个ARTS:
每周至少做一个 leetcode 的算法题、阅读并点评至少一篇英文技术文章、学习至少一个技术技巧、分享一篇有观点和思考的技术文章。(也就是 Algorithm、Review、Tip、Share 简称ARTS)

第三周了,哇咔咔。时间过得好快^_^

由于微信不支持添加外链,所以大家访问有链接的地方直接滑到文章最底部点击阅读原文就可以访问了^_^

一 

Algorithm

LeetCode 617. Merge Two Binary Trees 链接

【题意】

Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not.

You need to merge them into a new binary tree. The merge rule is that if two nodes overlap, then sum node values up as the new value of the merged node. Otherwise, the NOT null node will be used as the node of new tree.

给出两个二叉树,并想象当你把其中一个覆盖另一个时,两棵树的一些节点重叠,而其他树则不重叠。

您需要将它们合并到一个新的二叉树中。 合并规则是,如果两个节点重叠,则将节点值加起来作为合并节点的新值。 否则,非空节点将用作新树的节点。

Example 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Input: 
Tree 1 Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
Output:
Merged tree:
3
/ \
4 5
/ \ \
5 4 7

【思路】

直接递归调用给定的函数即可。我们首先判断,如果t1不存在,则直接返回t2,反之,如果t2不存在,则直接返回t1。如果上面两种情况都不满足,那么以t1和t2的结点值之和建立新结点t,然后对t1和t2的左子结点调用递归并赋给t的左子结点,再对t1和t2的右子结点调用递归并赋给t的右子结点,返回t结点即可。

【参考代码】

  • 不使用额外的空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if( t1 == 0 ) {
return t2;
}
if( t2 == 0 ) {
return t1;
}
t1->left = mergeTrees(t1->left, t2->left);
t1->right = mergeTrees(t1->right, t2->right);
t1->val += t2->val;
return t1;
}
};
  • 使用额外的空间,另新定义一棵二叉树
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if( t1 == 0 ) {
return t2;
}
if( t2 == 0 ) {
return t1;
}
TreeNode *t = new TreeNode(t1->val + t2->val);
t->left = mergeTrees(t1->left, t2->left);
t->right = mergeTrees(t1->right, t2->right);
return t;
}
};

Review

pyqt5-tutorial

这篇 ​​PyQt5​​​ 教程展示了如何使用​​Python 3​​​ 和 ​​Qt​​​ 在​​Windows​​​ ,​​Mac​​​ 或 ​​Linux​​​ 上创建 ​​GUI​​ 。 涵盖了为应用创建安装程序。

总的文章内容包括以下几部分

  • 什么是PyQt5
  • 安装PyQt5
  • 创建一个GUI
  • 窗口部件
  • 布局
  • 自定义样式(包括 内置样式;自定义颜色;样式表)
  • 信号/槽
  • 编译应用程序
  • 奖励:创建安装程序
  • 总结

这篇教程循序渐进介绍了相关的知识,并且以在​​Ubuntu​​ 系统下一步步运行命令的图文的形式介绍,读起来不会有太难的地方。

详细中文翻译版教程可以参考我的这篇文章 :PyQt5简明中文教程

三 

Tip

由于最近几天笔记本重装了系统,不可避免的需要重新配置 ​​git+hexo​​环境,这里暂且把配置过程记录下来,其中一些我觉得比较注意的地方会标粗提醒给读者。

这里只说如何在 ​​windows​​​ 下成功安装 ​​hexo​​ 并运行起来,关于主题以及配置不做记录。

安装node.js

因为 ​​hexo​​​ 是基于 ​​node.js​​​ 的,所以 ​​node.js​​ 是必须要装的,安装也特别简单,去 官网 下载适合自己b 的版本。安装过程一直下一步就行了,什么也不用选,在网上查资料的时候,看到有说要在 Custom Setup 这一步记得选 Add to PATH,但我在安装的时候这个选项是默认选好的,不用动它,也许是版本的原因,建议在安装时留意一下,毕竟自己配置环境变量还是有点麻烦。

安装好以后,打开 CMD 命令窗口,输入 ​​npm -v​​ ,如果出现版本号,那说明安装成功了并且环境变量也配置好了,如果是未知命令那就要配置一下环境变量。

安装hexo

这一步我是用 git bash 来安装的,如果安装了 git,那么就可以用 git bash,如果没有装,那就用 CMD窗口,效果是一样一样的,命令都是一样的。

安装 hexo 的命令:

1
npm install -g hexo-cli

输入 ​​hexo -v​​ 出现一系列的版本号就是安装成功啦,就像下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ hexo -v
hexo: 3.7.1
hexo-cli: 1.1.0
os: Windows_NT 6.1.7601 win32 x64
http_parser: 2.8.0
node: 8.11.3
v8: 6.2.414.54
uv: 1.19.1
zlib: 1.2.11
ares: 1.10.1-DEV
modules: 57
nghttp2: 1.32.0
napi: 3
openssl: 1.0.2o
icu: 60.1
unicode: 10.0
cldr: 32.0
tz: 2017c

生成博客

从现在开始,我们就可以用 hexo 来生成一个博客了。

首先新建一个文件夹,位置随意,然后 ​​cd​​ 到这个文件夹下,运行命令:

1
hexo init

hexo 会将这个文件夹初始化成一个博客专用文件夹,生成过程稍微要点时间,耐心等待。

初始化完成后,会有一个默认主题以及一个 hello-word 的默认文章。所以我们可以先生成博客来看一下效果,运行命令:

1
hexo generate  //可以简写成 hexo g

然后 hexo 会开始生成博客,生成结束后,会多出一个 public 的文件夹,这个文件夹就是 hexo 生成的一个完整的静态网站,也就是我们的博客。网站生成好了,我们要浏览它,所以要开启一下服务器,运行命令:

1
hexo server  //可以简写成 hexo s

然后打开浏览器,输入 ​​localhost:4000​​ 就可以浏览我们的博客了。

远程部署

远程部署指的是,博客在我们本地生成好了以后部署到远程仓库去,如果远程仓库支持 pages 服务的话,那就可以通过这样的方法发布和更新博客。

要使用远程部署需要先安装 hexo-deployer-git ,注意,这是适用于 git 类型仓库的方法,其他仓库的方法在文章结尾提供的官网连接中有说明。

运行命令:

1
npm install hexo-deployer-git --save

安装好 hexo-deployer-git 后,修改博客目录配置文件中的 deploy 字段:

1
2
3
4
5
deploy:
type: git
repo: git仓库项目地址
branch: 分支
message: 自定义提交说明,这个字段可以没有

如果 git 仓库是 ssh,则需要生成 .ssh,这是 git 的操作,不做详述。

四 

Share

为什么你将来不在需要购买汽车?

越来越多的技术分析师预测,在不到20年的时间里,我们都将不再拥有汽车。因为类似 Uber 的平台将会提供自动驾驶的电动车网络,它是如此便宜,所以你决定不购买自己的汽车。

你可能觉得这种预测太大胆了,那就让我们想想汽车取代马车的速度。下面是1900年纽约第五大道的照片。

ARTS-for-week3-20181102_结点

照片里面一匹马也没有,发生了什么事?

原来1908年,福特汽车公司第一辆 Model T Ford 下线了,使得汽车的价格降低到普通人可以接受的地步。马车立刻就被淘汰了。

现在,无人驾驶技术正在快速成熟之中,也许马上就会投入实际使用。英国政府已经表示,希望在2021年之前,就批准第一辆全自动驾驶汽车上路。只要有一个城市证明这项技术是安全和有用的,世界其他地方将很快赶上来。

未来电动汽车将是下一场科技革命吗?这个话题值得思考。

又到新的周末了,祝大家周末愉快~

 晚安

ARTS-for-week3-20181102_node.js_02

ARTS-for-week3-20181102_结点_03