1. Algorithm

46. 全排列(中等)

描述:

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:
输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]
思路:

回溯法。深度优先搜索(DFS)和交换元素,

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        if (nums == null || nums.length == 0) {
            return null;
        }
        List<List<Integer>> result = new ArrayList<>();
        dfs(0, nums, result);
        return result;
    }

    private void dfs(int curr, int[] nums, List<List<Integer>> result) {
        if (curr == nums.length - 1) {
            List<Integer> res = new ArrayList<>();
            for (int num : nums) {
                res.add(num);
            }
            result.add(res);
            return;
        }
        for (int i = curr; i < nums.length; i++) {
            swap(nums, i, curr);
            dfs(curr + 1, nums, result);
            swap(nums, i, curr);
        }
    }

    private void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
}

2. Review

These four “clean code” tips will dramatically improve your engineering team’s productivity 这四个「整洁代码」的技巧将极大地提高工程团队的生产力

作者列举了整洁代码的四个技巧:

  • 如果没有经过测试,代码就是不合格的

    要写大量的测试,特别是单元测试,否则你会后悔的。

  • 选择有意义的名字

    为变量、类和函数,起一个短小准确的名字。

  • 类和函数应该短小,遵循单一职责法则

    函数不该超过 4 行,类代码不该超过 100 行。它们做并且只做一件事。

    (点评:这里阈值太低,可以适量放大。《阿里巴巴 Java 开发手册》里讲到:方法一般不超过 80 行)

  • 函数不该产生副作用

    副作用(比如修改输入参数)是魔鬼,代码里面千万不要有,尽可能在函数契约中明确指定这一点。

3. Tip

有时候觉得 IDE 太重量级了,打开个工程都要十几秒。相比之下,Sublime 是轻量级的编辑器,每次几乎秒开,代码显示友好,有丰富的插件。每个程序员都该熟练使用一种 IDE 之外的编辑器,IDE 不总是可靠的,或许也尝试白板编程。

4. Share

前些天,有个头条的同行和我聊,说他们面试非常看重基础。基础是什么?我觉得包括这几项:算法和数据结构、操作系统、计算机网络、数据库原理、设计模式等。这些是经久不衰的、不依赖具体语言的基础原理。想要在编程路上走得长远,静下心来研究基础非常必要。