写点什么

ARTS 打卡 第 15 周

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

ARTS简介

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

Algorithm

力扣(LeetCode)38. 外观数列

给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。

注意:整数序列中的每一项将表示为一个字符串。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:

1. 1
2. 11
3. 21
4. 1211
5. 111221


第一项是数字 1

描述前一项,这个数是 1 即 “一个 1 ”,记作 11

描述前一项,这个数是 11 即 “两个 1 ” ,记作 21

描述前一项,这个数是 21 即 “一个 2 一个 1 ” ,记作 1211

描述前一项,这个数是 1211 即 “一个 1 一个 2 两个 1 ” ,记作 111221

解题思路:每一个序列都是对前一个序列的描述,那么我们可以选择使用递归进行处理,当获得上一个序列之后,用start表示开头,循环遍历,直到找到不一样的进行记录。

我们可以用一个数组,将计算过的记录下来,提高时间。

ps:当然这道题因为限制了大小,所以可以狠心把1~30所有都记录下来,直接返回。

class Solution {
private static final String[] RESULT = new String[30];
static {
RESULT[0] = "1";
RESULT[1] = "11";
RESULT[2] = "21";
RESULT[3] = "1211";
RESULT[4] = "111221";
}
public String countAndSay(int n) {
if (n < 1 || n > 30) {
throw new IllegalArgumentException(" n shoud 1 ≤ n ≤ 30");
}
if (n < 5 || RESULT[n - 1] != null) {
return RESULT[n - 1];
}
StringBuilder res = new StringBuilder();
// 拿到上一层的字符串
String str = countAndSay(n - 1);
int length = str.length();
// 开始指针为0
int start = 0;
// 注意这从起始条件要和下面长度统一
for (int i = 1; i < length + 1; i++) {
// 字符串最后一位直接拼接
if (i == length) {
res.append(i - start).append(str.charAt(start));
// 直到start位的字符串和i位的字符串不同,拼接并更新start位
} else if (str.charAt(i) != str.charAt(start)) {
res.append(i - start).append(str.charAt(start));
start = i;
}
}
RESULT[n - 1] = res.toString();
return RESULT[n - 1];
}
}

ps:参考资料《算法的乐趣》

Review

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

微服务架构-Pattern: Pattern: Transaction log tailing

这篇文章的主要介绍了微服务架构下如何进行发布数据更新:事务日志追踪模式

问题:你实现了事务发件箱模式,那么如何将事件发布到发件箱然后到事件代理

解决方法,追踪数据库事务日志,将插入到发件箱中的每条消息/事件发布到消息代理。

好处

  1. 没有2PC

  2. 保证准确度

不足

  1. 相当的难以理解

  2. 必须是特定的数据库

  3. 很难处理如何避免重复发布

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

Tips

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

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

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

文本排序

sort 用于将文本文件内容加以排序。它以行为单位来排序。

格式:[OPTION]… [FILE]…

常用选项:

  1. -b 忽略每行前面开始出的空格字符。

  2. -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。

  3. -f 排序时,将小写字母视为大写字母。

  4. -g 按照通常的数值进行比较,,暗含-b

  5. -i 排序时,只考虑[\040-\0176]字符。

  6. -m 将几个排序好的文件进行合并。

  7. -M 将前面3个字母依照月份的缩写进行排序。

  8. -n 依照字符串的数值的大小排序,暗含-b

  9. -u 意味着是唯一的(unique),输出的结果是去完重了的。

  10. -o<输出文件> 将排序后的结果存入指定的文件。

  11. -r 以相反的顺序来排序。

  12. -t<分隔字符> 指定排序时所用的栏位分隔字符。

  13. -k POS1[,POS2] 从关键字POS1开始,*到*POS2结束. 字段数和字符偏移量都从1开始计数(与+POS1选项比较)

  14. +POS1 [-POS2] 从关键字POS1开始,到POS2*之前*结束(快过时了) 字段数和字符偏移量都从零开始计数(与-k选项比较)

1.cat testsort.txt
2.Math 95
3.English 85
4.Physics 30
5.Chemistry 70
6.
7.sort testsort.txt
8.Chemistry 70
9.English 85
10.Math 95
11.Physics 30
12.
13.sort -r testsort.txt # 相反顺序排序
14.Physics 30
15.Math 95
16.English 85
17.Chemistry 70
18.


uniq 用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用

选项:uniq [选项]… [输入 [输出]]

常用选项:

  1. -c或–count 在每列旁边显示该行重复出现的次数。

  2. -d或–repeated 仅显示重复出现的行列。

  3. -D 显示所有重复的行

  4. -f, –skip-fields=N 比较时跳过前 N 个域、

  5. –group[=METHOD] 显示所有行,用一个空行分隔每一组 METHOD={separate(default),prepend, append, both}

  6. -i, –ignore-case 比较时忽略大小写

  7. -s<字符位置>或–skip-chars=<字符位置> 忽略比较指定的字符。

  8. -u或–unique 只显示不重复的行。

  9. -w, –check-chars=N 对每行第 N 个字符以后的内容不作比较

  10. [输入] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;

  11. [输出] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。

cat testuniq.txt
Math 95
Math 95
Math 95
English 85
English 85
English 85
English 85
Physics 30
Physics 30
Chemistry 70
Chemistry 70
Chemistry 70
Chemistry 70

uniq testuniq.txt
Math 95
English 85
Physics 30
Chemistry 70

uniq -c testuniq.txt
3 Math 95
4 English 85
2 Physics 30
4 Chemistry 70



Share

分享最近对计算机基础的复习,这次分享的是程序的机器级表示 - 数组的分配和访问,可能会有不足之处,之后会根据理解继续修改。



发布于: 2020 年 09 月 06 日阅读数: 51
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

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