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 singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */ var addTwoNumbers = function(l1, l2) { // 如果两个链表都为空,则直接返回空 if (!l1 && !l2) return null; // 否则先创建一个哑节点(head)作为首节点,最后结果是 head.next // 再设置一个变量(curr)用于迭代过程中保存当前节点 // 同时再设置一个变量(carry)用于保存上一轮相加产生的进位 let head = { next: null }, curr = head, carry = 0; // l1 和 l2 分别用于保存当前迭代到的两个节点 // 只要它们都不为空,就说明要继续迭代(相加) while (l1 && l2) { // 计算当前两个节点的和,并加入上一次相加产生的进位 let sum = l1.val + l2.val + carry; // 如果该和大于 9 就需要从和中扣除 10,放入进位(进位置 1) if (sum > 9) { carry = 1; sum -= 10; } // 否则进位置 0 else { carry = 0; } // 对该和创建节点 curr.next = new ListNode(sum); // 并将其作为下一轮迭代的结果节点 curr = curr.next; // 设置下一轮迭代的两个要相加的节点 l1 = l1.next; l2 = l2.next; } // 最后如果有进位,就把进位作为一个节点,与当前剩余节点(l1 || l2)相加,再将相加结果接到当前节点的 next 上 // 如果没有进位,则直接将当前剩余节点(l1 || l2)接到当前节点的 next 上 curr.next = carry ? addTwoNumbers(l1 || l2, new ListNode(carry)) : (l1 || l2); // 最后返回哑节点的 next 作为结果 return head.next; };
执行结果:通过 执行用时:112 ms,在所有 javascript 提交中击败了99.66% 的用户 内存消耗:38.6 MB,在所有 javascript 提交中击败了47.87% 的用户
思路: 如果两个链表都为空,则直接返回空 否则先创建一个哑节点(head)作为首节点,最后结果是 head.next 再设置一个变量(curr)用于迭代过程中保存当前节点 同时再设置一个变量(carry)用于保存上一轮相加产生的进位 l1 和 l2 分别用于保存当前迭代到的两个节点 只要它们都不为空,就说明要继续迭代(相加) 计算当前两个节点的和,并加入上一次相加产生的进位 如果该和大于 9 就需要从和中扣除 10,放入进位(进位置 1) 否则进位置 0 对该和创建节点 并将其作为下一轮迭代的结果节点 设置下一轮迭代的两个要相加的节点 最后如果有进位,就把进位作为一个节点,与当前剩余节点(l1 || l2)相加,再将相加结果接到当前节点的 next 上 如果没有进位,则直接将当前剩余节点(l1 || l2)接到当前节点的 next 上 最后返回哑节点的 next 作为结果
对比: 与高分对比: 本代码运行 1563 个测试用例花费约 112ms,平均一个测试用例约 0.07ms; 高分代码运行 1563 个测试用例花费约 112ms,平均一个测试用例约 0.07ms。 思路相似代码略。
阅读: The Mediator Pattern in JavaScript
点评: 本文介绍了中介者模式的应用场景,也就是当多个对象之间存在多对多的引用时。
此时使用中介者模式,可以将这种多对多的对象引用转换为一个中介者对多个对象的单对多模式。
这不仅简化了关系,而且还松散了这些多个对象之间的耦合,从而有效减少运行错误,并在一定程度上提高了可扩展性和可维护性。
但是中介者模式也有缺点,就是对象之间的行为逻辑都交给中介者来处理,势必会造成中介者的逻辑复杂度提升, 如果不能有效化解,那么由此导致的单点错误和伸缩性与可维护性降低,将使得中介者模式的使用弊大于利。
最后,文章使用 JavaScript 语言,通过一个 RPC 游戏的例子,实现了中介者模式。
UML 是 Unified Modeling Language 的简称,即统一建模语言,又称标准建模语言。
它是用来对软件密集系统进行可视化建模的一种语言,有助于明确软件各功能职责划分及其之间的关系。
在这个过程中,UML 图中使用带箭头或不带箭头的实线或虚线或其组合来表示类之间的关系。分为:
参考: 看懂UML类图和时序图
分享一篇极客“左耳听风”专栏文章(据说可限10位免费阅读哦) 98 | 高效学习:如何学习和阅读代码
这是一篇关于如何高效学习的方法论和实践指导的系列文章(之四),
注意是“高效学习”而非“高速学习”。
本文论述了阅读文档和阅读代码各自的重要性及其各自适用的场景,并分享了阅读源码的实践经验。
读文档还是读代码: 在阐述程序运行逻辑方面,文档(包括书)和代码有其各自的作用:
所以文档和代码都会告诉我们 What 和 How,只是代码专注于细节的实现(Detail),而文档则会更侧重于原理的解释(Why)。 因此如果想知道程序的实现细节,应该看代码;想知道为什么要这么实现,应该看文档——看什么取决于想获得什么。
另外,在学习的不同阶段,选择看代码还是选择看文档也有所不同。 人对新事物的学习过程基本都是从“感性认识”到“理性认识”的。 所以:
如何阅读源码:
阅读代码前的准备:
了解代码的组成部分,参考列表:(具体内容见原文)
The text was updated successfully, but these errors were encountered:
No branches or pull requests
ARTS 第十七周(2019.10.21~2019.10.27)
Algorithm 两数相加(中等难度)
题目
两数相加(中等难度)
代码
执行结果:通过
执行用时:112 ms,在所有 javascript 提交中击败了99.66% 的用户
内存消耗:38.6 MB,在所有 javascript 提交中击败了47.87% 的用户
思路:
如果两个链表都为空,则直接返回空
否则先创建一个哑节点(head)作为首节点,最后结果是 head.next
再设置一个变量(curr)用于迭代过程中保存当前节点
同时再设置一个变量(carry)用于保存上一轮相加产生的进位
l1 和 l2 分别用于保存当前迭代到的两个节点
只要它们都不为空,就说明要继续迭代(相加)
计算当前两个节点的和,并加入上一次相加产生的进位
如果该和大于 9 就需要从和中扣除 10,放入进位(进位置 1)
否则进位置 0
对该和创建节点
并将其作为下一轮迭代的结果节点
设置下一轮迭代的两个要相加的节点
最后如果有进位,就把进位作为一个节点,与当前剩余节点(l1 || l2)相加,再将相加结果接到当前节点的 next 上
如果没有进位,则直接将当前剩余节点(l1 || l2)接到当前节点的 next 上
最后返回哑节点的 next 作为结果
对比:
与高分对比:
本代码运行 1563 个测试用例花费约 112ms,平均一个测试用例约 0.07ms;
高分代码运行 1563 个测试用例花费约 112ms,平均一个测试用例约 0.07ms。
思路相似代码略。
Review JavaScript 设计模式之中介者模式
阅读:
The Mediator Pattern in JavaScript
点评:
本文介绍了中介者模式的应用场景,也就是当多个对象之间存在多对多的引用时。
此时使用中介者模式,可以将这种多对多的对象引用转换为一个中介者对多个对象的单对多模式。
这不仅简化了关系,而且还松散了这些多个对象之间的耦合,从而有效减少运行错误,并在一定程度上提高了可扩展性和可维护性。
但是中介者模式也有缺点,就是对象之间的行为逻辑都交给中介者来处理,势必会造成中介者的逻辑复杂度提升,
如果不能有效化解,那么由此导致的单点错误和伸缩性与可维护性降低,将使得中介者模式的使用弊大于利。
最后,文章使用 JavaScript 语言,通过一个 RPC 游戏的例子,实现了中介者模式。
Tip 看懂 UML 图中类之间的关系
UML 是 Unified Modeling Language 的简称,即统一建模语言,又称标准建模语言。
它是用来对软件密集系统进行可视化建模的一种语言,有助于明确软件各功能职责划分及其之间的关系。
在这个过程中,UML 图中使用带箭头或不带箭头的实线或虚线或其组合来表示类之间的关系。分为:
参考:
看懂UML类图和时序图
Share [极客专栏] 98 | 高效学习:如何学习和阅读代码
分享一篇极客“左耳听风”专栏文章(据说可限10位免费阅读哦)
98 | 高效学习:如何学习和阅读代码
这是一篇关于如何高效学习的方法论和实践指导的系列文章(之四),
注意是“高效学习”而非“高速学习”。
本文论述了阅读文档和阅读代码各自的重要性及其各自适用的场景,并分享了阅读源码的实践经验。
读文档还是读代码:
在阐述程序运行逻辑方面,文档(包括书)和代码有其各自的作用:
所以文档和代码都会告诉我们 What 和 How,只是代码专注于细节的实现(Detail),而文档则会更侧重于原理的解释(Why)。
因此如果想知道程序的实现细节,应该看代码;想知道为什么要这么实现,应该看文档——看什么取决于想获得什么。
另外,在学习的不同阶段,选择看代码还是选择看文档也有所不同。
人对新事物的学习过程基本都是从“感性认识”到“理性认识”的。
所以:
在计算机这个技术创新能力超强、技术种类繁多的行业,每个人都既是新手也是老手。
如何阅读源码:
阅读代码前的准备:
应先读一遍用户手册,再试运行感受下。
通过这些文档可以了解到软件的方方面面。如果没有,只能指望原作者还在了。
了解代码的组成部分,参考列表:(具体内容见原文)
The text was updated successfully, but these errors were encountered: