ARTS 打卡 第 13 周

用户头像
引花眠
关注
发布于: 2020 年 08 月 23 日

ARTS简介

Algorithm 是一道算法题,Review 是读一篇英文文章,Technique/Tips 是分享一个小技术,Share 是分享一个观点。

Algorithm

力扣(LeetCode)36. 有效的数独

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。

数字 1-9 在每一列只能出现一次。

数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

示例 1:
输入:
[
["5","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
输出: true

示例 2:
输入:
[
["8","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
输出: false



解题思路:

  1. 判断数独是否有效需要对判断三次

class Solution{
private static final char DOT = '.';
public boolean isValidSudoku(char[][] board) {
return checkIfRowWithoutRepetition(board) && checkIfColWithoutRepetition(board)
&& checkIfSubBoxesWithoutRepetition(board);
}
private boolean checkWithoutReptition(char[][] board) {
Set<Character> forRow = null;
Set<Character> forCol = null;
Set<Character> forSub = null;
for (int i = 0; i < 9; i++) {
forRow = new HashSet<>();
forCol = new HashSet<>();
forSub = new HashSet<>();
for (int j = 0; j < 9; j++) {
//不是'.',
char cForRow = board[i][j];
if (DOT != cForRow) {
if (forRow.contains(cForRow)) {
return false;
} else {
forRow.add(cForRow);
}
}
char cForCol = board[j][i];
if (DOT != cForCol) {
if (forCol.contains(cForCol)) {
return false;
} else {
forCol.add(cForCol);
}
}
int row = j / 3 + i / 3 * 3;
int col = j % 3 + i % 3 * 3;
//不是'.',
char cForSub = board[row][col];
if (DOT != cForSub) {
if (forSub.contains(cForSub)) {
return false;
} else {
forSub.add(cForSub);
}
}
}
}
return true;
}
}

Review

学习-微服务架构模式系列,网站地址是:https://microservices.io

微服务架构-Pattern: Pattern: Event sourcing

这篇文章的主要介绍了微服务架构下如何进行发布数据更新:事件源 **问题**:如何可靠/自动地更新数据库并发布消息/事件? **要求**:不能使用2段式提交 **解决方法**,事件源:保持状态改变事件列表,发布事件,给感兴趣的服务

好处

  1. 解决了一个事件驱动架构中的关键问题

  2. 使得无论何时发生时状态改变都能可靠的发布事件

  3. 因为持久化的是事件而不是域对象,所以可以有效的避免对象关系阻抗不匹配

  4. 提供100%可靠的业务改变审计日志

  5. 业务逻辑由松耦合的、事件交换的业务实体构成,便于从单体应用向微服务架构迁移

  6. 避免CURD的限制

  7. 避免高并发更新同一数据

  8. 使得查询任意时间的状态成为可能

  9. 查询导致状态的的事件

不足

  1. 由于采用了不同或不熟悉的编程风格,会有学习曲线

  2. 很难查询

  3. 只直接支持通过主键查询业务实体

  4. 复杂查询必须使用CQRS聚合查询

  5. 必须确保数据最终一致

ps:《微服务架构设计模式》

Tips

记录我对于Linux的学习,文件相关的命令:

ps:”~” 表示为 home 目录,”.” 则是表示目前所在的目录,”..” 则表示当前目录的上一层目录

-h 用人类可读的格式展示(G(千兆字节),M(兆字节),K(千字节)),大部分命令有这个参数

分割文件

split 用于将一个文件分割成数个。

格式:split [OPTION] [INPUT [PREFIX]]

参数

  1. -<行数> 或 -l num : 指定每多少行切成一个小文件

  2. -b<字节> : 指定每多少字节切成一个小文件,可以使用后缀:b=512字节,k=1K,m=1 Meg

  3. -C<字节> : 与参数”-b”相似,但是在切割时将尽量维持每行的完整性

[PREFIX] : 设置切割后文件的前置文件名, split会自动在前置文件名后再加上编号

ps: 该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。

如果没有设置[PREFIX]则默认以”x”开头,

如果没有指定INPUT,或INPUT是-,就从标准输入读取数据.

1.split -6 a.c
2.$ ls #执行ls指令
3.#获得当前目录结构
4.a.c xaa xab

csplit 用于将文件依照指定的范本样式分割

格式:csplit [OPTION]… FILE PATTERN…

选项:

  1. -b<输出格式>或–suffix-format=<输出格式>:预设的输出格式其文件名称为xx00,xx01等,用户可以通过改变<输出格式>来改变输出的文件名;

  2. -f<输出字首字符串>或–prefix=<输出字首字符串>:预设的输出字首字符串其文件名为xx00,xx01等,如果制定输出字首字符串为“hello”,则输出的文件名称会变成hello00,hello、01……

  3. -k或–keep-files:保留文件,就算发生错误或中断执行,与不能删除已经输出保存的文件;

  4. -n<输出文件名位数>或–digits=<输出文件名位数>:预设的输出文件名位数其文件名称为xx00,xx01……如果用户指定输出文件名位数为“3”,则输出的文件名称会变成xx000,xx001等;

  5. -q或-s或–quiet或——silent:不显示指令执行过程;

  6. -z或–elide-empty-files:删除长度为0 Byte文件。

格式:

  1. /[正则表达式]/ 创建从当前行开始直到(但不包含)包含指定模式的那一行的段的文件。

  2. INTEGER 创建从当前行开始直到(但不包含)指定行

  3. {*} 表示根据匹配重复执行分割,直到文件尾停止,使用{整数}的形式指定分割执行的次数。

  4. %[正则表达式]% 使包含指定模式的行成为当前行,但不为段创建一个文件。

1.
2.csplit file1 3 #会将文件file1切分为两个文件,一个包含1-2,另一个包含3-end
3.
4.csplit file1 11 22 33 44 #会将文件file1切分5为个文件,一个包含1-10,11-21,22-32,33-43,44-
5.
6.csplit file1 100 {*} #会将文件file1按照100行切分,直到末尾
7.
8.csplit -n 3 file1 120 # 将文本文件file1以120行为分界点切割成2份,并指定输出文件名的位数为3
9.
10.csplit file1 /"Chapter X"/ # 文件以字符串”Chapter X”为分界符,分成两部分
11.

Share

分享最近对计算机基础的复习,这次分享的是遇到的bug:Java ForEach空指针异常,可能会有不足之处,之后会根据理解继续修改。



发布于: 2020 年 08 月 23 日 阅读数: 36
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

发布
暂无评论
ARTS打卡 第13周