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.14~2019.10.20) #29

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

ARTS 第二十九周(2019.10.14~2019.10.20) #29

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

Comments

@catcuts
Copy link
Owner

catcuts commented Oct 24, 2019

ARTS 第二十九周(2019.10.14~2019.10.20)

Algorithm 二叉树的层次遍历

题目

二叉树的层次遍历(中等难度)

代码

/**
 * Definition for a binary tree root.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function(root, receiver, level = 1) {
    // 若为空树则直接返回空数组
    if (!root) return receiver || [];
    // 否则先初始化
    receiver = receiver || [[root.val]];
    // 然后取出左右节点,并计算出下一层的层序
    // 这个层序对应数组的下标,该层的所有节点数值都会被放入该下标对应的元素数组中
    // 从而生成最终结果
    let { left, right } = root, nextLevel = level + 1;
    // 若有左节点
    if (left) {
        // 则先将左节点的值放入对应数组
        if (receiver[level]) receiver[level].push(left.val);
        else receiver[level] = [left.val];
        // 再递归调用处理该左节点,将其子子孙孙层节点的值放入对应数组中
        levelOrder(left, receiver, nextLevel);
    }
    // 若有右节点,同理
    if (right) {
        if (receiver[level]) receiver[level].push(right.val);
        else receiver[level] = [right.val];
        levelOrder(right, receiver, nextLevel);
    }
    // 最终返回结果
    return receiver;
};

执行结果:通过
执行用时:68 ms, 在所有 javascript 提交中击败了 87.19% 的用户
内存消耗:34.8 MB, 在所有 javascript 提交中击败了 27.86% 的用户

思路:
若为空树则直接返回空数组,否则先初始化
然后取出左右节点,并计算出下一层的层序
这个层序对应数组的下标,该层的所有节点数值都会被放入该下标对应的元素数组中
从而生成最终结果
其中,若有左节点,则先将左节点的值放入对应数组
再递归调用处理该左节点,将其子子孙孙层节点的值放入对应数组中
若有右节点,同理
最终返回结果

对比:
与高分对比:
本代码运行 34 个测试用例花费约 68ms,平均一个测试用例约 2ms;
高分代码运行 34 个测试用例花费约 68ms,平均一个测试用例约 2ms。
思路相似代码略。

Review 服务开发模式之“断路器模式”

阅读:
Understand CircuitBreaker Design pattern with simple practical example

点评:

本文介绍了服务开发的一种实用模式,被称作“断路器模式”(Circuit Breaker Pattern)。

断路器,在电气领域中指的是一种用来断开电路的设备。
为什么要断开电路?可能的原因有接地故障或者过负荷,及时断开电路可以防止故障和异常范围扩大。

运用到服务器开发中,当客户端向 A 服务发送请求,想要获得某些数据,
而 A 服务需要向 B 服务请求获得该数据,再返回给客户端时,
如果 B 服务出现了故障或者过载,就无法及时响应 A 服务的请求,
故而 A 服务无法及时对客户端做出应答——很明显故障和异常的范围包括了 B、A 和 客户端。

比较合理的运行方式应该是,客户端向 A 服务请求数据,
如果 A 服务向 B 服务发送请求获得该数据的时间过长,
或者 A 服务已经获知 B 服务无法正常响应请求时,
则应该直接向客户端发送失败响应,
同时,A 服务应更新本地 B 服务的状态,并在获知 B 服务恢复正常时重置该状态。

这种模式就是“断路器模式”。

本文经过测试,使用断路器模式的服务在运行过程中的错误率远远低于未使用断路器模式的服务。

Tip 字符串数组排序

我们知道,对于一个数值数组,排序可以使用:

someNumberList.sort((a, b) => a - b);  // 反之 b - a 为降序

但对于一个字符串数组,就不能像上面那样子直接相减了。

此时可以使用:

someStringList.sort((a, b) => a.localeCompare(b));  // 反之为降序

localeCompare 详细参数参考:

Share [极客专栏] 97 | 高效学习:深度、归纳和坚持实践

分享一篇极客“左耳听风”专栏文章(据说可限10位免费阅读哦)
97 | 高效学习:深度、归纳和坚持实践

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

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

本文提供了一套系统学习的模板,强调了举一反三、总结归纳和坚持实践的重要性。

学习一项技术遵循的模板

  1. 这个技术出现的背景、初衷和要达到什么目标或要解决什么问题
  2. 这个技术的优势和劣势(trade-off)
  3. 这个技术的适用场景
  4. 这个技术的组成部分和关键点
  5. 这个技术的底层原理和关键实现
  6. 已有的实现与这个技术的对比

如何训练举一反三的能力

  1. 联想能力:对于一个场景,制造出各种不同的问题和难题
  2. 抽象能力:对于一个问题,尽可能找出多种解并比较优劣
  3. 自省能力:对于一个解,尽可能编写多种测试用例以健壮

如何正确进行总结和归纳

  1. 学习的初始阶段,可不急于总结归纳,不急于下判断做结论,保留部分知识的不确定性,保持对知识的开放状态
  2. 多阅读一些经典方法论图书并模仿,形成写博客的习惯,或者讲给别人听,开放出来接受批评和反馈会成长更快

坚持不懈

  1. 把坚持形成成果公开出来,接受点赞获得正反馈
  2. 把坚持形成习惯,同吃饭喝水,就不会形成压力
  3. 只需坚持不懈,就已经超过了 99% 的其他人
@catcuts catcuts added the ARTS label Oct 24, 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