ARTS
- Algorithm 每周至少做一个 Leetcode 的算法题。主要是为了编程训练和学习。
- Review 每周阅读并点评至少一篇英文技术文章。主要是为了学习英文。
- Tip 每周学习至少一个技术技巧。主要是为了总结和归纳你在日常工作中所遇到的知识点。
- Share 每周分享一篇有观点和思考的技术文章。主要是为了建立你的影响力,能够输出价值观。
1 Algorithm
问题:22 括号生成 【中等】
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 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,且难以察觉。
所以,当程序执行过程中出现错误时,应该尽可能地抛出异常,以使得我们能够尽早地发现并修复它。
2 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。
3 Use Optionals instead of nulls
public Coffee badGet() {
// ...
}
public Optional<Coffee> goodGet() {
// ...
}
第一个方法可能返回一个 null, 这很容易使得调用者抛出空指针异常。但我们使用 Optional 作为返回值,我们就可以直接去使用 Optional 的方法去检查是否包含值。