Jan 13, 2020 ~ Jan 19, 2020

Algorithm

Problem 112. Path Sum (路径总和) 题目链接

题目描述:给定一棵二叉树和一个值 sum ,检查二叉树是否存在根到叶子路径之和等与 sum 的路径,若存在,则返回 true,反之返回 false。例如,sum = 22,二叉树如下:

      5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1

返回结果 true,因为 5->4->11->2

思路为:树的遍历要使用递归,sum同时要保持更新,比如上面的例子中,使用了根节点后,sum = 22 - 5 = 17,需要对结点为空结点和叶子结点进行特殊处理。

通过的代码如下

# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None class Solution:
def hasPathSum(self, root: TreeNode, sum: int) -> bool:
if root == None:
return False
elif root != None and root.left == None and root.right == None:
return (sum == root.val)
else:
return (self.hasPathSum(root.left, sum-root.val)) or (self.hasPathSum(root.right, sum-root.val))

Review

本周继续 Review 每个程序员需要知道的97件事(英文名:97 Things Every Programmer Should Know)。原文链接。下面是本周的5个小内容:

  • 不要忽略错误(Don't Ignore that Error!) 原文链接

    异常是一个很好的指示和处理错误的方式,但是很多代码中仅仅是捕捉到异常而不去处理异常,比如下面的代码
try {
// ...do something...
}
catch (...) {} // ignore errors

忽略错误可能会导致一些严重的后果:比如产生难以发现的错误,利用错误来侵入、破坏软件。因此,我们需要对错误进行处理,而不是忽略它。

  • 不要仅仅学习语言,而要了解其文化(Don't Just Learn the Language, Understand its Culture) 原文链接

    编程语言有许多,它们都有着独特的特点和适用的条件。单单学习语言可能会无法理解某一些语言,尤其是一些差别比较大的语言时。比如一直学习并使用 Java,然后去学习 Haskell 时,可能会对函数式编程产生疑惑,此时应该去了解下函数式编程的文化,比如产生的背景,原因,目的,生态等。
  • 不要将程序钉在直立位置(Don't Nail Your Program into the Upright Position) 原文链接

    应该尽可能是的使用异常来妥善处理错误,而不是直接将错误抛给用户。就好比 UI 设计中有一条规则,永远不要让用户看到错误报告,而是好像解决了问题。因为直接弹出的错误会给用户带来不好印象,同时大部分用户即使知道了错误原因也并知道如何改正它。
  • 不要依赖“魔术发生”(Don't Reply on "Magic Happens Here") 原文链接

    很多情况下,即使你不了解具体情况,程序仍可以正常运行,我们称其为“魔法”。比如,程序有内存泄漏的错误,但是每次泄漏的内存都很少,也许程序一直运行十几个甚至几十个小时也不会出现问题,但是终有一刻内存被耗尽了,问题出现了。
  • 不要重复自己(Don't Repeat Yourself) 原文链接

    不要重复自己(DRY)是所有编程中最基本的原则之一,其中包含三个子观点。1)复制是浪费:每一行代码都必须得到维护,不必要的复制会使代码库膨胀,同时给系统增加了不必要的复杂性。2)流程重复要求自动化:开发过程中有不少过程是重复的,比如测试,如果手动完成则需要增加许多不必要的劳动。3)逻辑重复要求抽象:逻辑重复可以用复制粘贴 if-else 或者switch-case 来进行检测,更好的方式是利用设计模式来避免,比如工厂方法。

Tips

Python 中字符与 ASCII 码值的转换:ord()函数是将字符转换为 ASCII 码值,chr()函数是将 ASCII 码值转换为字符,举例如下:

print("ord('H') = ",ord('H')) # ord('H') =  72
print("chr(77) = ",chr(77)) # chr(77) = M

Sharing

在 Review 部分中提到的不要将程序钉在直立位置(Don't Nail Your Program into the Upright Position),我认为是一个很取巧的办法,这样做有好有坏,不管是仅仅报告出现错误,还是具体的错误原因。我觉得对用户的影响是一样的,好的办法是报告一个简略的错误,不想具体了解的用户进需要知道发生错误即可,想具体了解错误的用户可以查看详细错误。

ARTS Week 12的更多相关文章

  1. python 各模块

    01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支 ...

  2. Python Standard Library

    Python Standard Library "We'd like to pretend that 'Fredrik' is a role, but even hundreds of vo ...

  3. 在mybatis中写sql语句的一些体会

    本文会使用一个案例,就mybatis的一些基础语法进行讲解.案例中使用到的数据库表和对象如下: article表:这个表存放的是文章的基础信息 -- ------------------------- ...

  4. ARTS 12.10 - 12.14

    从陈皓博主的专栏里学到一个概念,争取可以坚持下去: 我在我的读者群中推荐出 ARTS 的任务,每个人每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Sha ...

  5. ARTS 12.31 - 1.4

    Algorithm 这是一道需要用动态规划的问题.求字符串的最长回文子序列. 复习了一遍动态规划,重点是要分析出最优解所包含的子问题的最优解,把过程描述为数学公式. 题目https://leetcod ...

  6. ARTS 12.24 - 12.28

    从陈皓博主的专栏里学到一个概念,争取可以坚持下去: 每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西! 一个 Algori ...

  7. arts 打卡12周

    一 算法:  字符串转换整数 (atoi)   请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找 ...

  8. 【ARTS】01_07_左耳听风-20181224~1230

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  9. 【ARTS】01_05_左耳听风-20181210~1216

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

随机推荐

  1. 还看不懂同事代码?快来补一波 Java 7 语法特性

    前言 Java 平台自出现到目前为止,已经 20 多个年头了,这 20 多年间 Java 也一直作为最流行的程序设计语言之一,不断面临着其他新兴编程语言的挑战与冲击.Java 语言是一种静态强类型语言 ...

  2. docker-tmpfs挂载

    使用tmpfs挂载 卷和绑定装置允许在主机和容器之间共享文件,以便即使在容器停止后也可以保留数据. 如果你在Linux上运行Docker,你有第三个选择:tmpfs mounts.使用tmpfs装载创 ...

  3. 记第一个javaweb网页

      <%@ page language="java" contentType="text/html; charset=utf-8" pageEncodin ...

  4. ubuntu下报错Sub-process /usr/bin/dpkg returned an error code (1)的解决方法

    cd /var/lib/dpkg sudo mv info info.bak #即备份一个info sudo mkdir info #新建一个新的info目录 然后采用以下命令重装那些出错的软件包 s ...

  5. js-xlsx 一个实用的js 导出列表插件

    在前端开发过程中,导出列表功能的开发无非两种,一种是有后台生成,发生给前端下载,第二种是前端进行列表的导出工作.之前接触了一种前端导出列表的插件 tableExport.js ,但是其缺点很明显,需要 ...

  6. hive 动态分区

    非常重要的动态分区属性: hive.exec.dynamic.partition  是否启动动态分区.false(不开启) true(开启)默认是 false hive.exec.dynamic.pa ...

  7. 19秦皇岛现场赛F题 dfs

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6736 如果环的边长为k,那么环的删边方案数是2k-1.如果链的边长为k,那么链的删边方案数是2k.环的 ...

  8. Nginx代理服务——反向代理

    ​ Nginx可以代理的服务 ​ 正向代理,例如翻墙 ​ 反向代理 ​ 正向和反向代理的区别 区别在于代理的对象不一样 正向代理:代理的对象是客户端 反向代理:代理的对象是服务器 配置语法 Synta ...

  9. 深入理解Java虚拟机:JVM高级特性与最佳实践

    第一部分走近Java第1章走近Java21.1概述21.2Java技术体系31.3Java发展史51.4Java虚拟机发展史91.4.1SunClassicExactVM91.4.2SunHotSpo ...

  10. 20200104模拟赛 问题A 图样

    题目 分析: 老规矩,遇到期望要准备好随时投降... 大致想到了按位处理,然后分别下去搜索,再用组合数加加减减一下... 但是两个连通块之间连边的期望怎么算呢? 很好,投降... 下来看题解... 果 ...