ARTS Week 22
Algorithm
本周的 LeetCode 题目为 297. 二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
1
/ \
2 3
/ \
4 5
输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
二叉树的序列化后的结果采用先序遍历的方式。
- 在进行序列化时,先判断当前节点是否为空,若为空则记录
null
,若不为空,则先将根的值和分隔符(',')添加,再依次递归处理当前节点的左子树、右子树。 - 在进行反序列化时,先判断当前是否为
null
,若为null
则返回null
,若不为null
,则先以当前值构造出根节点,移除第一个元素,再依次构建该节点的左子树、右子树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
realSerialize(root, sb);
return sb.toString();
}
public void realSerialize(TreeNode root, StringBuilder sb) {
if (root != null) {
sb.append(root.val);
sb.append(",");
realSerialize(root.left, sb);
realSerialize(root.right, sb);
} else {
sb.append("null,");
}
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[] dataArr = data.split(",");
List<String> dataList = new ArrayList<>(Arrays.asList(dataArr));
// dataList = Arrays.asList(dataArr);
TreeNode ans = realDeserialize(dataList);
return ans;
}
public TreeNode realDeserialize(List<String> dataList) {
if (dataList.get(0).equals("null")) {
dataList.remove(0);
return null;
}
TreeNode root = new TreeNode(Integer.valueOf(dataList.get(0)));
dataList.remove(0);
root.left = realDeserialize(dataList);
root.right = realDeserialize(dataList);
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));
Review
本周 Review 的英文文章为:如何在 git 中使用 squash
和 rebase
作者详细介绍了使用 squash
和 rebase
的流程,首先你需要备份一个分支用来尝试:
git checkout my-branch-name
git branch backup-my-branch-name
git push origin backup-my-branch-name
而后查看日志找到不属于你的最新提交的 id,别忘了复制它
git log
而后开始 rebase
操作,将 -i
后面的内容替换为你刚刚找到的提交 id
git rebase -i the-commit-id-you-looked-up-goes-here
通过在除第一个提交之外的所有提交前面放置“s”而不是“pick”来标记要压缩(squash
)的提交。而后保存并关闭,等待弹出新的文本编辑器提示来输入你的 commit
信息。
使用 git status
来检查是否有任何问题。
接下来作者将所有提交都合并到 main
分支中,先确保本地的 main
分支是最新的
git checkout main
git pull origin main
接下来进行 rebase
操作,先切换分支再 rebase
git checkout my-branch-name
git rebase main
修复发生的 git 冲突后,暂存如下的文件:
git add some-file.js
而后再继续完成 rebase
:
git rebase --continue
最后提交 commit,请先检查分支是你的分支!
git push --force-with-lease origin my-branch-name
如果途中出现了问题,你还有一个备份分支可以用来恢复,或者使用 git rebase --abort
来中止正在进行的 rebase
。
为什么要在 rebase
前进行 squash
?在使用 squash
压缩提交后,rebase
需要解决的冲突至多需要一次,而当你的公司/组织/项目要求你不得压缩时,那么就不要使用 squash
。
Tip
使用宏定义的注意事项,宏定义是直接替换,并不是保存计算的结果。示例代码如下:
#include <stdio.h>
#define NUM_0 4
#define NUM_1 5-1
#define NUM_2 (5-1)
int main()
{
printf("%d\n", 5 % NUM_0); // 5 % NUM_1 = 5 % 4 = 1
printf("%d\n", 5 % NUM_1); // 5 % NUM_1 = 5 % 5-1 = 0 - 1 = -1
printf("%d\n", 5 % NUM_2); // 5 % NUM_1 = 5 % (5-1) = 5 % 4 = 1
return 0;
}
程序的运行结果如下:
$ clang test.c
$ ./a.out
1
-1
1
Share
未来几周内打算抽空认真地、系统性地回顾下基本的数据结构、算法,为下一步做 LeetCode 题目做准备。
ARTS Week 22的更多相关文章
- 【ARTS】01_44_左耳听风-201900909~201900915
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- ARTS Week 8
Dec 16, 2019 ~ Dec 22, 2019 Algorithm Problem 53 Maximum Subarray 最大子数组 题目链接 题目描述:给定一个数组,在所有连续的子数组中, ...
- 造!又有新的生产力语言了「GitHub 热点速览 v.22.30」
作者:HelloGitHub-小鱼干 你还记得那些 PHP 开发都去哪了吗?转 Golang 了!移动端现在流行什么?Flutter 编程.现在谷歌带着新的生产力语言来了,Carbon,代号:C++ ...
- CENTOS 6.5 平台离线编译安装 Mysql5.6.22
一.下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.22.tar.gz 二.准备工作 卸载之前本机自带的MYSQL 安装 cmake,编 ...
- EC笔记:第4部分:22、所有成员都应该是private的
EC笔记:第4部分:22.所有成员都应该是private的 更简单的访问 用户不用记得什么时候该带上括号,什么时候不用带上括号(因为很确定的就要带上括号) 访问限制 对于public的成员变量,我们可 ...
- Hadoop学习笔记—22.Hadoop2.x环境搭建与配置
自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- Fedora 22中的Services and Daemons
Introduction Maintaining security on your system is extremely important, and one approach for this t ...
- Fedora 22中的RPM软件包管理工具
Introduction The RPM Package Manager (RPM) is an open packaging system that runs on Fedora as well a ...
随机推荐
- Linux(Centos)安装中文字体库(文档中文字符不显示)
yum -y install fontconfig 在/usr/shared/fonts目录下新建一个目录chinese 然后打开windows本地的字体库 将这里面的所有文件上传到centos里我们 ...
- 串口之完整封装包含发送和接收(windows+ubuntu已通过初步测试)(持续更新)
这里下载源码 更新日志 16-08-2021 V1.0.3 1.修复接收数据没有将数据传递给应用层的bug 2.windows版本:设置接收数据相邻字节间间隔为5ms 24-09-2020 V1.0. ...
- 【LeetCode】111. Minimum Depth of Binary Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 [LeetCode] 题目地址 ...
- Shortest Path(hdu5636)
Shortest Path Accepts: 40 Submissions: 610 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: ...
- 【安卓】AndroidStudio使用本地gradle进行build的配置
1.修改setting使用local gradle2.将下载的gradle-6.7.1-all.zip放入E:/AndroidProject文件夹 修改gradle-wapper.propertie使 ...
- Sublime Text 3结合Chrome实现网页的自动刷新
我们在编写前端代码时,写好一部分代码时想要看一看代码的实现效果,每次都要手动刷新会非常麻烦,神器来了,LiveReload插件实现网页的实时刷新,操作方法如下: 1. 官网下载Sublime Text ...
- Spring企业级程序设计 • 【第2章 Spring Bean管理进阶】
全部章节 >>>> 本章目录 2.1 bean标签和import标签 2.1.1 标签中的id属性和name属性 2.1.2 Bean的作用范围和生命周期 2.1.2 Be ...
- Android 悬浮窗
悬浮窗是一种比较常见的需求.例如把视频通话界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情. 本文给出一个简单的悬浮窗实现.可缩小activity和还原大小.可悬浮在其他activity上.使用 ...
- Oracle数据库导入csv文件(sqlldr命令行)
1.说明 Oracle数据库导入csv文件, 当csv文件较小时, 可以使用数据库管理工具, 比如DBevaer导入到数据库, 当csv文件很大时, 可以使用Oracle提供的sqlldr命令行工具, ...
- 简单的制作ssl证书,并在nginx和IIS中使用
2020年最后一篇博文收官,提前祝各位园友新年快乐 现在的后端开发,动不动就是需要https,或者说是需要ssl证书,既然没有正版的证书,那么我们只能自己制作ssl的证书了. 说明:证书的制作采用的是 ...