diff --git a/problems/前序/ACM模式如何构建二叉树.md b/problems/前序/ACM模式如何构建二叉树.md index 682e18f5..d0cf2341 100644 --- a/problems/前序/ACM模式如何构建二叉树.md +++ b/problems/前序/ACM模式如何构建二叉树.md @@ -45,7 +45,21 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914223147.png) -那么此时大家是不是应该知道了,数组如何转化成 二叉树了。**如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2**。 +那么此时大家是不是应该知道了,数组如何转化成 二叉树了。**如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2**。计算过程为: + +如果父节点在第$k$层,第$m,m \in [0,2^k]$个节点,则其左孩子所在的位置必然为$k+1$层,第$2*(m-1)+1$个节点。 + +- 计算父节点在数组中的索引: + $$ + index_{father}=(\sum_{i=0}^{i=k-1}2^i)+m-1=2^k-1+m-1 + $$ + +- 计算左子节点在数组的索引: + $$ + index_{left}=(\sum_{i=0}^{i=k}2^i)+2*m-1-1=2^{k+1}+2m-3 + $$ + +- 故左孩子的下表为$index_{left}=index_{father}\times2+1$,同理可得到右子孩子的索引关系。也可以直接在左子孩子的基础上`+1`。 那么这里又有同学疑惑了,这些我都懂了,但我还是不知道 应该 怎么构造。 diff --git a/problems/前序/代码风格.md b/problems/前序/代码风格.md index a71ac420..b48665e5 100644 --- a/problems/前序/代码风格.md +++ b/problems/前序/代码风格.md @@ -13,7 +13,7 @@ 最近看了很多录友在[leetcode-master](https://mp.weixin.qq.com/s/wZRTrA9Rbvgq1yEkSw4vfQ)上提交的代码,发现很多录友的代码其实并不规范,这一点平时在交流群和知识星球里也能看出来。 -很多录友对代码规范应该不甚了解,代码看起来并不舒服。 +很多录友对代码规范应该了解得不多,代码看起来并不舒服。 所以呢,我给大家讲一讲代码规范,我主要以C++代码为例。 @@ -27,7 +27,7 @@ 现在一些小公司,甚至大公司里的某些技术团队也不注重代码规范,赶进度撸出功能就完事,这种情况就要分两方面看: -* 第一种情况:这个项目在业务上具有巨大潜力,需要抢占市场,只要先站住市场就能赚到钱,每年年终好几十万,那项目前期还关心啥代码风格,赶进度把功能撸出来,赚钱就完事了,例如12年的微信,15年的王者荣耀。这些项目都是后期在不断优化的。 +* 第一种情况:这个项目在业务上具有巨大潜力,需要抢占市场,只要先站住市场就能赚到钱,每年年终好几十万,那项目前期还关心啥代码风格,赶进度把功能撸出来,赚钱就完事了,例如12年的微信,15年的王者荣耀。这些项目都是后期再不断优化的。 * 第二种情况:这个项目没赚到钱,半死不活的,代码还没有设计也没有规范,这样对技术人员的伤害就非常大了。 @@ -39,7 +39,7 @@ 这里我简单说一说规范问题。 -**权威的C++规范以Google为主**,我给大家下载了一份中文版本,在公众号「代码随想录」后台回复:googlec++编程规范,就可以领取。 +**权威的C++规范以Google为主**,我给大家下载了一份中文版本,在公众号「代码随想录」后台回复:googlec++编程规范,就可以领取。(涉及到微信后台的回复,没更改) **具体的规范要以自己团队风格为主**,融入团队才是最重要的。 diff --git a/problems/前序/力扣上的代码想在本地编译运行?.md b/problems/前序/力扣上的代码想在本地编译运行?.md index 970af7ff..c4899a20 100644 --- a/problems/前序/力扣上的代码想在本地编译运行?.md +++ b/problems/前序/力扣上的代码想在本地编译运行?.md @@ -13,11 +13,11 @@ 然后录友就问了:如何打日志呢? -其实在力扣上打日志也挺方便的,我一般调试就是直接在力扣上打日志,偶尔需要把代码粘到本例来运行添加日志debug一下。 +其实在力扣上打日志也挺方便的,我一般调试就是直接在力扣上打日志,偶尔需要把代码粘到本地来运行添加日志debug一下。 在力扣上直接打日志,这个就不用讲,C++的话想打啥直接cout啥就可以了。 -我来说一说力扣代码如何在本题运行。 +我来说一说力扣代码如何在本地运行。 毕竟我们天天用力扣刷题,也应该知道力扣上的代码如何在本地编译运行。 diff --git a/problems/前序/编程素养部分的吹毛求疵.md b/problems/前序/编程素养部分的吹毛求疵.md new file mode 100644 index 00000000..3f18f9d1 --- /dev/null +++ b/problems/前序/编程素养部分的吹毛求疵.md @@ -0,0 +1,31 @@ +## 代码风格 + +- `不甚了解`是不能更了解的意思,这个地方应该使用存疑。 +- `后期在不断优化`,'在'应为'再'。 +- `googlec++编程规范`,Google拼写错误 + +## 代码本地编译 + +- `粘到本例来运行`存疑,应为本地 +- `本题运行`存疑,应为本地 + +## ACM二叉树 + +- 左孩子和右孩子的下标不太好理解。我给出证明过程: + + 如果父节点在第$k$层,第$m,m \in [0,2^k]$个节点,则其左孩子所在的位置必然为$k+1$层,第$2*(m-1)+1$个节点。 + + - 计算父节点在数组中的索引: + $$ + index_{father}=(\sum_{i=0}^{i=k-1}2^i)+m-1=2^k-1+m-1 + $$ + + - 计算左子节点在数组的索引: + $$ + index_{left}=(\sum_{i=0}^{i=k}2^i)+2*m-1-1=2^{k+1}+2m-3 + $$ + + - 故左孩子的下表为$index_{left}=index_{father}\times2+1$,同理可得到右子孩子的索引关系。也可以直接在左子孩子的基础上`+1`。 + + +