ARTS (第58周)
不管做任何事情,如果我们总是等到所有的东西都想好了再开始,那这件事情可能永远都开始不了。有句老话讲:万事开头难,所以,先迈出第一步很重要。
Algorithm 算法
按之字形顺序打印二叉树
1 | 题目描述 |
解法 BFS 双栈交替并行的方式
也可以是其它的数据结构结构进行遍历,注意位置的索引即可。
1 | import java.util.ArrayList; |
把二叉树打印成多行
1 | 题目描述 |
解法 BFS
这题的本质就是个bfs 直接使用bfs来实现
这里我使用的是单栈的写法。
1 | import java.util.ArrayList; |
序列化二叉树
1 | 题目描述 |
解法1 按层遍历的方式
一层层记录,空节点用#替代
最易理解的写法
1 | String Serialize1(TreeNode root) { |
解法2 前序遍历
Serialize就是一个前序遍历的结果保存
Deserialize 则是根据前序遍历的结果进行的解析。
核心思路为 当遇到#(空叶子节点)的时候就是遇到空叶子节点,就应该跳到下一个位置的遍历了。
如当前空节点为父节点的左节点,那么就应该遍历右节点了。
如果是右节点,则代表当前这个子树已经完成了。
1 | import java.util.LinkedList; |
Review 英文文章
https://spring.io/guides/gs/handling-form-submission/
处理表单数据
Tip 技巧
极客时间《设计模式之美》25~26章
https://time.geekbang.org/column/intro/250
Repository 层只关注数据的读写。Service 层只关注业务逻辑,不关注数据的来源。Controller 层只关注与外界打交道,数据校验、封装、格式转换,并不关心业务逻辑。三层之间的关注点不同,分层之后,职责分明,更加符合单一职责原则,代码的内聚性更好。
针对 Controller、Service、Repository 三层,每层都会定义相应的数据对象,它们分别是 VO(View Object)、BO(Business Object)、Entity,例如 UserVo、UserBo、UserEntity。
系统拆分有垂直和水平两个方向。水平方向基于业务来做拆分,就是模块化;垂直方向基于流程来做拆分,就是分层。
迈出第一步很重要
对于非业务通用框架的开发,我们在做需求分析的时候,除了功能性需求分析之外,还需要考虑框架的非功能性需求。比如,框架的易用性、性能、扩展性、容错性、通用性等。对于复杂框架的设计,很多人往往觉得无从下手。今天我们分享了几个小技巧,其中包括:画产品线框图、聚焦简单应用场景、设计实现最小原型、画系统设计图等。这些方法的目的都是为了让问题简化、具体、明确,提供一个迭代设计开发的基础,逐步推进。实际上,不仅仅是软件设计开发,不管做任何事情,如果我们总是等到所有的东西都想好了再开始,那这件事情可能永远都开始不了。有句老话讲:万事开头难,所以,先迈出第一步很重要。
迭代思维
写代码的过程本就是一个修修改改、不停调整的过程,肯定不是一气呵成的。你看到的那些大牛开源项目的设计和实现,也都是在不停优化、修改过程中产生的。比如,我们熟悉的 Unix 系统,第一版很简单、粗糙,代码不到 1 万行。所以,迭代思维很重要,不要刚开始就追求完美。面向对象设计和实现要做的事情,就是把合适的代码放到合适的类中。至于到底选择哪种划分方法,判定的标准是让代码尽量地满足低耦合、高内聚、单一职责、对扩展开放对修改关闭等之前讲的各种设计原则和思想,尽量地做到代码可复用、易读、易扩展、易维护。
Share 分享
https://blog.csdn.net/u012009613/article/details/52752625 java的 spi机制