Skip to content
New issue

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

ARTS 第十七周(2019.10.21~2019.10.27) #17

Open
catcuts opened this issue Oct 29, 2019 · 0 comments
Open

ARTS 第十七周(2019.10.21~2019.10.27) #17

catcuts opened this issue Oct 29, 2019 · 0 comments
Labels

Comments

@catcuts
Copy link
Owner

catcuts commented Oct 29, 2019

ARTS 第十七周(2019.10.21~2019.10.27)

Algorithm 两数相加(中等难度)

题目

两数相加(中等难度)

代码

/**
 * 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。
思路相似代码略。

Review JavaScript 设计模式之中介者模式

阅读:
The Mediator Pattern in JavaScript

点评:
本文介绍了中介者模式的应用场景,也就是当多个对象之间存在多对多的引用时。

此时使用中介者模式,可以将这种多对多的对象引用转换为一个中介者对多个对象的单对多模式。

这不仅简化了关系,而且还松散了这些多个对象之间的耦合,从而有效减少运行错误,并在一定程度上提高了可扩展性和可维护性。

但是中介者模式也有缺点,就是对象之间的行为逻辑都交给中介者来处理,势必会造成中介者的逻辑复杂度提升,
如果不能有效化解,那么由此导致的单点错误和伸缩性与可维护性降低,将使得中介者模式的使用弊大于利。

最后,文章使用 JavaScript 语言,通过一个 RPC 游戏的例子,实现了中介者模式。

Tip 看懂 UML 图中类之间的关系

UML 是 Unified Modeling Language 的简称,即统一建模语言,又称标准建模语言。

它是用来对软件密集系统进行可视化建模的一种语言,有助于明确软件各功能职责划分及其之间的关系。

在这个过程中,UML 图中使用带箭头或不带箭头的实线或虚线或其组合来表示类之间的关系。分为:

  • 实现关系(虚线白箭头):具象类继承抽象类
  • 泛化关系(实线白箭头):具象子类继承具象父类
  • 组合关系(实线黑宝石):几个不同的具象类构成一个具象类
  • 聚合关系(实线白宝石):几个相同的具象类构成一个具象类
  • 关联关系(实线尖箭头):一个具象类与另一个具象类有关
  • 关联关系(虚线尖箭头):一个具象类用到另一个具象类

参考:
看懂UML类图和时序图

Share [极客专栏] 98 | 高效学习:如何学习和阅读代码

分享一篇极客“左耳听风”专栏文章(据说可限10位免费阅读哦)
98 | 高效学习:如何学习和阅读代码

这是一篇关于如何高效学习的方法论和实践指导的系列文章(之四),

注意是“高效学习”而非“高速学习”。

本文论述了阅读文档和阅读代码各自的重要性及其各自适用的场景,并分享了阅读源码的实践经验。

读文档还是读代码
在阐述程序运行逻辑方面,文档(包括书)和代码有其各自的作用:

  • 代码告诉我们程序运行什么逻辑What、如何运行的How、以及运行的细节Details
  • 而文档或书不会告诉我们细节,但它除了告诉我们程序运行逻辑的 What、How、还会告诉我们程序运行为什么要使用这样的逻辑Why

所以文档和代码都会告诉我们 What 和 How,只是代码专注于细节的实现(Detail),而文档则会更侧重于原理的解释(Why)。
因此如果想知道程序的实现细节,应该看代码;想知道为什么要这么实现,应该看文档——看什么取决于想获得什么。

另外,在学习的不同阶段,选择看代码还是选择看文档也有所不同。
人对新事物的学习过程基本都是从“感性认识”到“理性认识”的。
所以:

  • 如果是新手,应该多读代码,多动手写代码,因为此时更需要“感性认识”,而“理性认识”还不能体会到;
  • 如果是老手,应该多看优质的文档和书籍,因为此时的成长需要更多的“理性认识”。
    在计算机这个技术创新能力超强、技术种类繁多的行业,每个人都既是新手也是老手。

如何阅读源码

阅读代码前的准备:

  • 基础知识:相关语言和基础技术
  • 软件功能:软件功能、特性及其配置项。
    应先读一遍用户手册,再试运行感受下。
  • 相关文档:内部文档、Readme、Release Notes、Design、Wiki 等
    通过这些文档可以了解到软件的方方面面。如果没有,只能指望原作者还在了。
  • 代码组织结构:也就是代码目录中的每个目录是什么功能,每个文档的作用。

了解代码的组成部分,参考列表:(具体内容见原文)

  • 接口抽象定义
  • 模块粘合层
  • 业务流程
  • 具体实现
    • 代码逻辑
    • 出错处理
    • 数据处理
    • 重要算法
    • 底层交互
  • 运行时调试
@catcuts catcuts added the ARTS label Oct 29, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant