We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
题目
对称二叉树
代码
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param {TreeNode} root * @return {boolean} */ var isSymmetric = function(root) { if (!root) return true; return _isSymmetric(root.left, root.right); }; function _isSymmetric(left, right) { // `left` 节点 和 `right` 节点有一个为 `null` 且另一个不为 `null` if ((!left && right) || (left && !right)) return false; // `left` 节点 和 `right` 节点都为 `null` if (!left && !right) return true; // `left` 节点 和 `right` 节点都不为 `null`,且其 `val` 值不相等 if (left.val !== right.val) return false; // 递归判断 return _isSymmetric(left.left, right.right) && _isSymmetric(left.right, right.left); }
执行结果:通过 执行用时:68 ms, 在所有 javascript 提交中击败了 96.62% 的用户 内存消耗:35.5 MB, 在所有 javascript 提交中击败了 32.48% 的用户
思路: 递归地判断 left 节点和 right 节点是否是彼此对称的(_isSymmetric)。 递归结束条件是:
left
right
_isSymmetric
null
false
true
val
(看起来用不了尾递归优化)
对比: 与高分对比: 本代码运行 195 个测试用例花费约 68ms,平均一个测试用例约 0.35ms; 高分代码运行 195 个测试用例花费约 68ms,平均一个测试用例约 0.35ms。 思路一致代码略。
阅读: Design Patterns: Command
点评: 本文介绍并实践了软件设计中的命令模式(Command Pattern)。
命令模式的主要思想是:
适用于:需要对行为进行记录、撤销、重做、事务等应用场景。 原因:
另外,它也体现了“依赖倒置原则”:
依赖倒置原则中,依赖抽象的思想是源于,抽象的事物会比具体的事物对外更不容易发生变化。
下图是命令模式的基本结构:
文中对此举了一个股票买卖的例子作为实现:
自己看完后也学着画了一下 UML 图(不是很规范的,主要是固化自己的理解):
文中还举了一个星球大战机器人 R2D2 的例子,也很有趣。
阅读参考: 命令模式 - 维基百科,自由的百科全书 命令模式 - 菜鸟教程 深入浅出UML类图 - uml.org.cn
尾调用优化是指:函数中调用函数时,如果被调用函数是调用函数的最后一步,则调用堆栈中只会保存被调用函数的信息,从而达到内存占用优化的效果。
尾调用优化特别适用于优化递归,被称为尾递归。因为递归往往要保存很多函数调用堆栈,所以不注意就会发生栈溢出,此时可以考虑使用尾递归来优化。
例如:
不使用尾递归优化的阶乘函数:最多需要保存 n 个调用记录,堆栈空间复杂度 O(n)
function factorial(n) { if (n === 1) return 1; return n * factorial(n - 1); } factorial(5) // 120
使用尾递归优化后:此时调用记录总是只有最后一个,堆栈空间复杂度 O(1)
function factorial(n, total = 1/*提供使用者调用时的默认参数*/) { if (n === 1) return total; return factorial(n - 1, n * total); } factorial(5) // 120
还需要注意的是:
arguments
func.caller
参考:尾调用优化 - 阮一峰的网络日志
分享一篇极客“左耳听风”专栏文章(据说可限10位免费阅读哦) 96 | 高效学习:源头、原理和知识地图
这是一篇关于如何高效学习的方法论和实践指导的系列文章(之二),
注意是“高效学习”而非“高速学习”。
本文强调了挑选知识和信息源、注重基础和原理和使用知识地图的重要性。
优质的信息源包含如下特质:
优质信息源推荐:Medium 因为很多文章都 Google 到了 Medium 上。
基础和原理在信息爆炸时代尤为重要的理由:
知识地图带来的好处:
补充:关于练好英文的重要性: 英文对于我们来说至关重要,尤其对于计算机知识。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
ARTS 第二十八周(2019.10.7~2019.10.13)
Algorithm 对称二叉树
题目
对称二叉树
代码
执行结果:通过
执行用时:68 ms, 在所有 javascript 提交中击败了 96.62% 的用户
内存消耗:35.5 MB, 在所有 javascript 提交中击败了 32.48% 的用户
思路:
递归地判断
left
节点和right
节点是否是彼此对称的(_isSymmetric
)。递归结束条件是:
left
节点 和right
节点有一个为null
且另一个不为null
——返回false
;或left
节点 和right
节点都为null
——返回true
;或left
节点 和right
节点都不为null
,且其val
值不相等——返回false
(看起来用不了尾递归优化)
对比:
与高分对比:
本代码运行 195 个测试用例花费约 68ms,平均一个测试用例约 0.35ms;
高分代码运行 195 个测试用例花费约 68ms,平均一个测试用例约 0.35ms。
思路一致代码略。
Review 软件设计模式之“命令模式”
阅读:
Design Patterns: Command
点评:
本文介绍并实践了软件设计中的命令模式(Command Pattern)。
命令模式的主要思想是:
适用于:需要对行为进行记录、撤销、重做、事务等应用场景。
原因:
另外,它也体现了“依赖倒置原则”:
依赖倒置原则中,依赖抽象的思想是源于,抽象的事物会比具体的事物对外更不容易发生变化。
下图是命令模式的基本结构:
文中对此举了一个股票买卖的例子作为实现:
自己看完后也学着画了一下 UML 图(不是很规范的,主要是固化自己的理解):
文中还举了一个星球大战机器人 R2D2 的例子,也很有趣。
阅读参考:
命令模式 - 维基百科,自由的百科全书
命令模式 - 菜鸟教程
深入浅出UML类图 - uml.org.cn
Tip 尾调用优化
尾调用优化是指:函数中调用函数时,如果被调用函数是调用函数的最后一步,则调用堆栈中只会保存被调用函数的信息,从而达到内存占用优化的效果。
尾调用优化特别适用于优化递归,被称为尾递归。因为递归往往要保存很多函数调用堆栈,所以不注意就会发生栈溢出,此时可以考虑使用尾递归来优化。
例如:
不使用尾递归优化的阶乘函数:最多需要保存 n 个调用记录,堆栈空间复杂度 O(n)
使用尾递归优化后:此时调用记录总是只有最后一个,堆栈空间复杂度 O(1)
还需要注意的是:
因为:正常模式下,函数内部有一下两个变量,用于跟踪函数的调用栈:
arguments
:返回调用时函数的参数。func.caller
:返回调用当前函数的那个函数。参考:尾调用优化 - 阮一峰的网络日志
Share [极客专栏] 96 | 高效学习:源头、原理和知识地图
分享一篇极客“左耳听风”专栏文章(据说可限10位免费阅读哦)
96 | 高效学习:源头、原理和知识地图
这是一篇关于如何高效学习的方法论和实践指导的系列文章(之二),
注意是“高效学习”而非“高速学习”。
本文强调了挑选知识和信息源、注重基础和原理和使用知识地图的重要性。
优质的信息源包含如下特质:
(因为这样才能真正锻炼自己,养成独立发掘和思考的能力)
(因为这意味着材料是小心求证的,或是经时间和实践检验过的)
优质信息源推荐:Medium
因为很多文章都 Google 到了 Medium 上。
基础和原理在信息爆炸时代尤为重要的理由:
(因此如果我们对事物有不理解时,通常是我们基础没跟上,要先补基础)
蕴涵很多人类智慧结晶,会给我们带来很多启示和帮助
知识地图带来的好处:
补充:关于练好英文的重要性:
英文对于我们来说至关重要,尤其对于计算机知识。
那么我们一定远远落后于这个时代了。
那么我们算是能跟上这个时代。←
那么我们就算是领先于这个时代了。
The text was updated successfully, but these errors were encountered: