ARTS 第 1 周

 ARTS

  1. Algorithm 每周至少做一个 Leetcode 的算法题。主要是为了编程训练和学习。
  2. Review 每周阅读并点评至少一篇英文技术文章。主要是为了学习英文。
  3. Tip 每周学习至少一个技术技巧。主要是为了总结和归纳你在日常工作中所遇到的知识点。
  4. Share 每周分享一篇有观点和思考的技术文章。主要是为了建立你的影响力,能够输出价值观。

1 Algorithm


 问题:22 括号生成 【中等】

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 = 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

代码:

public class 括号生成_22 {

    public List<String> generateParenthesis(int n) {
        List<String> list = new ArrayList<>();
        String result = "";
        int left = 0;
        int right = 0;
        generateOneByOne(list, result, n, left, right);
        return list;
    }

    /**
     * @param list   存储所有正确的结果
     * @param result 用于表示一个正确的结果
     * @param n      n 对括号
     * @param left   已使用的左括号数
     * @param right  已使用的右括号数
     */
    private void generateOneByOne(List<String> list, String result, int n, int left, int right) {
        // 左右括号都用完了
        if (left == n && right == n) {
            list.add(result);
            return;
        }
        // 只要左括号还没有用完, 它是什么时候都可以添加的, 这是合法的
        if (left < n) {
            generateOneByOne(list, result + "(", n, left + 1, right);
        }
        // 只有左括号比右括号多的时候,往后面添加右括号才算合法的
        if (left > right) {
            generateOneByOne(list, result + ")", n, left, right + 1);
        }
    }
}

2 Review 


原文:What I learned from doing 1000 code reviews

点评:

本文作者根据他在领英做的大量代码审查工作的基础之上,给出了一些关于代码审查的建议:

1 Throw an exception when things go wrong

错误的案例如下:

List<String> getSearchResults(...) {
  try {
    List<String> results = // make REST call to search service
    return results;
  } catch (RemoteInvocationException e) {
    return Collections.emptyList();
  }
}

上面的例子,捕获了异常并返回了一个空的结果, 这样会使得外部调用者以为程序正确执行了,且其结果就应该是空的。但这可能使得我们掩盖了程序的一个 bug,且难以察觉。

所以,当程序执行过程中出现错误时,应该尽可能地抛出异常,以使得我们能够尽早地发现并修复它。

Use the most specific type possible

void doOperation(String opType, Data data); 
// where opType is "insert", "append", or "delete", this should have clearly been an enum

应该尽可能地指明类型。比如方法的参数可能包含多种类型或含义,那么我们可以使用枚举来替换 String。

Use Optionals instead of nulls

public Coffee badGet() {
   // ...
}
    
public Optional<Coffee> goodGet() {
   // ...  
}

第一个方法可能返回一个 null, 这很容易使得调用者抛出空指针异常。但我们使用 Optional 作为返回值,我们就可以直接去使用 Optional 的方法去检查是否包含值。

3 Tip 


使用 AOP 来统计方法的执行时间。

 4 Share 


分享一篇 Docker 入门的文章 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值