A(算法) :
题目: 98 Valid BST
解法思路: 中序遍历, 保存前继节点数据用作比较
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution(object):
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
self.pre_val = None
return self.helper(root)
def helper(self, root):
if not root:
return True
if not self.helper(root.left):
return False
if self.pre_val is not None\
and self.pre_val >= root.val:
return False
self.pre_val = root.val
return self.helper(root.right)
R(Review):
文章: CQRS 链接
总结: CQRS 的概念我很早就听过, 前几年的工作经验中, 我主要用于Mysql的读写分离场景, 就是一主多从的部署结构.这样做可以非常有效的扩展数据库的读取性能.
看完这篇文章后,我对读写分离的理解有加深了, 主要有几点:
. 读写分离就是将写操作交给Command 去处理, 读操作有Query 去处理
. 分离后可以根据不同的读取需求, 去扩展不同的Material View. 这些Material View 都是物理隔离的, 而且通常是反范式的结构, 也就是可以通过数据冗余来提高读取性能.
. 要保持Material View 之间的数据同步, 可以在每次写操作里增加event, 这样 Materail view 就可以通过eventSourcing 的方式保持数据同步, 但一定要注意数据一致性带来的问题, 尤其是金融系统, 自己去实现二段提交是一件非常坑爹的事情. 我建议只有流水式的insert 系统才比较适合用event sourcing.
T(Tips):
很多Java 开发者开发者都非常喜欢用intellij, 其中一个原因是里面有很多丰富的插件, 分享一个我最喜欢的插件: stringmanipulate , 这个工具几乎能涵盖我所有对字符串的便利操作, 提升效率
S(分享):
自己写的动态规划分享: 链接