Fork me on GitHub

ARTS(11)

ARTS 第十一周

每周完成一个ARTS(也就是 Algorithm、Review、Tip、Share 简称ARTS):

  1. 每周至少做一个 leetcode 的算法题
  2. 阅读并点评至少一篇英文技术文章
  3. 学习至少一个技术技巧
  4. 分享一篇有观点和思考的技术文章。

Algorithm

力扣 967. 连续差相同的数字

返回所有长度为 N 且满足其每两个连续位上的数字之间的差的绝对值为 K非负整数

请注意,除了数字 0 本身之外,答案中的每个数字都不能有前导零。例如,01 因为有一个前导零,所以是无效的;但 0 是有效的。

你可以按任何顺序返回答案。

示例 1:

1
2
3
输入:N = 3, K = 7
输出:[181,292,707,818,929]
解释:注意,070 不是一个有效的数字,因为它有前导零。

示例 2:

1
2
输入:N = 2, K = 1
输出:[10,12,21,23,32,34,43,45,54,56,65,67,76,78,87,89,98]

思路:DFS 搜索的方式,然后使用 set 去重

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

import org.junit.Test;

import java.util.HashSet;
import java.util.Set;

public class 连续差相同的数字 {

@Test
public void testResult() {
int[] results = numsSameConsecDiff(3, 7);
for (int i = 0; i < results.length; i++) {
System.out.println(results[i]);
}
}

public int[] numsSameConsecDiff(int N, int K) {
int[] num0 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
if (N == 1) {
return num0;
}
Set<Integer> list = new HashSet<>();
for (int i = 1; i < 10; ++i) {
DFS(K, list, i, 0, N);
}
return list.stream().mapToInt(Integer::intValue).toArray();
}

private void DFS(int K, Set<Integer> list, int i, int num, int N) {
if (N == 0) {
list.add(num);
return;
}
num += i * (Math.pow(10, N - 1));
for (int j = 0; j < 10; ++j) {
if (Math.abs(i - j) == K) {
DFS(K, list, j, num, N - 1);
}
}
}
}

Review

本周分享一篇介绍”蓝绿部署”和”金丝雀发行”(直男配直译)的文章:Serverless blue green deployments and canary releases with traffic shifting

知识背景:AWS Lambda 是亚马逊提供的云计算平台,用户将代码上传到平台上,然后可以供用户从 aws、web 或者 app等多种渠道触发计算得出结果。

AWS 的 S3 是亚马逊提供的存储服务。

文章解读如下:

  1. Blue Green Deployments,我翻译成蓝绿部署,其实就是一种代码版本更替的方式。在现有 blue 版本的基础上,发布了 green 版本,用户是通过一个 load balancer 才能访问到这些代码。所以 load balancer 在用户不可知的前提下,将访问代码的 access 切换到 green 版本,而一旦 green 版本的代码 bug 甚至失效时,又能及时切换回 blue 版本,这就是所谓的蓝绿部署。
  2. Canary Releases,我翻译成金丝雀发行,其实就是一种灰度发布的方式。将最近的版本仅发布到少量的用户那里,经过使用验证有效后,再逐步扩大到更多的用户那里。
  3. AWS 的 Lambda 又是如何做的呢?
    1. 新建一个 method,zip 打包,上传到AWS 的 S3,此方法属于为lambda funciton,此时版本号是 1;
    2. 再次发布时版本号是 2,以后是 3、4… 依此类推,即使 2 被删除,其版本号也不会被重用;
    3. 调用 method 时,可以指定方法名和版本号调用不同版本的方法。
    4. 也可以为方法设置别名,那么版本信息就对用户透明了,这时 AWS 通常会触发Prod权限的方法。
    5. 在 prod 里的多种版本,就会涉及上文提到的”蓝绿部署”和”金丝雀发行”用法了。
  4. 完。

Tip

分析一个 linux 命令行查看文件夹大小的命令:

1
2
3
4
5
## 查看根目录下各个文件夹的大小,max-depth=n 表示只深入到第 n 层目录
du -h -max-depth=1 /

## 查看~目录下文件 size 并从大到小排序
du -s ~/ | sort -nr

Share

1
2
3
4
5
6
7
8
// 分享一个 scala 的快排代码,十分精简也很有意思:

def qSort(a:List[Int]):List[Int]=
if(a.length<2) a
else
qSort(a.filter(_<a.head)) ++
a.filter(_==a.head) ++
qSort(a.filter(_>a.head))
-------------The End-------------