ARTS 打卡 第 4 周

发布于: 21 小时前

ARTS简介

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

Algorithm

Leecode 6. Z 字形变换

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:

L C I R

E T O E S I I G

E D H N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:”LCIRETOESIIGEDHN”。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入: s = “LEETCODEISHIRING”, numRows = 3

输出: “LCIRETOESIIGEDHN”

示例 2:

输入: s = “LEETCODEISHIRING”, numRows = 4

输出: “LDREOEIIECIHNTSG”

解释:

L D R

E O E I I

E C I H N

T S G

力扣(LeetCode)3. Z 字形变换

解题思路:

如果我们将LEETCODEISHIRING按照0-15标记,对numRows=3,4,5的结果也进行标记如下:

#numRows = 3
0 4 8 12
L C I R
1 3 5 7 9 11 13 15
E T O E S I I G
2 6 10 14
E D H N
#numRows = 4
0 6 12
L D R
1 5 7 11 13
E O E I I
2 4 8 10 14
E C I H N
3 9 15
T S G
#numRows = 5
0 8
L I
1 7 9 15
E E S G
2 6 10 14
E D H N
3 5 11 13
T O I I
4 12
C R
  1. 通过对比发现第0行与第n-1行,它们的索引编号间隔相同,比如:numRows=3时,间隔是4;numRows=4时,间隔是6;numRows=5时,间隔是8。可以推算出间隔公式cap=2numRows-2,第0行的索引间隔是0+k*cap,第n-1行的索引间隔是n-1+k*cap,其中k代表第几个cap

  2. 对于中间的行,经过分析,发现索引间隔由两组cap=2numRows-2的索引组成

  3. 所以可以看出,索引间隔有两种:i+k*cap与(k+1)*cap-i

public class ZigzagConversion {
public String solution(String s, int numRows) {
if (numRows == 1 || s == null || s.length() == 0) {
return s;
}
StringBuilder ans = new StringBuilder();
int n = s.length();
int cap = 2 * numRows - 2;
for (int i = 0; i < numRows; i++) {
for (int j = 0; j + i < n; j += cap) {
ans.append(s.charAt(j + i));// 第一组i+k*cap
if (i != 0 && i != numRows - 1 && j + cap - i < n) {
ans.append(s.charAt(j + cap - i)); // (k+1)*cap-i
}
}
}
return ans.toString();
}
}

Review

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

微服务架构-Pattern: Decompose by subdomain

这篇文章的主要介绍了分解模式:根据子域进行服务拆分:

当我们使用微服务的架构是,需要对整个应用进行分解,有多种分解的方式,这篇文章介绍的是根据业务能力进行分解。

分解服务的强制条件:

  1. 结构必须稳定

  2. 服务必须是高内聚的

  3. 松耦合的

  4. 可测试的

  5. 服务必须小,支撑团队小6-10

  6. 必须是自治的,与其他团队交互较少

在此种情况下,可以通过DDD(Domain-Driven Design,领域驱动设计)划分子域的方式进行分解。DDD 将应用的问题空间(业务)当作一个领域,领域有多个子域,子域可以按照如下方式进行分类:

  1. 核心 业务的关键区分点,应用的最有价值的部分

  2. 支撑 与业务是做什么的相关,但不是主要区分点;这个可以自己做或者外包

  3. 通用 不特定于业务,理想情况下使用现成的软件来实现

ps: 关于领域驱动设计的进一步资料可以看:豆瓣-领域驱动设计领域驱动设计精粹领域驱动设计与模式实战

比如,一个在线商城,可以分解为如下子域:

  1. 订单管理

  2. 商品管理

  3. 物流管理

  4. 库存管理……

这样的好处:

  1. 稳定 子领域是稳定的,所以服务也是稳定的

  2. 使用业务价值划分团队 团队较小,非常自治

  3. 高内聚低耦合

有以下问题需要解决:

  1. 如何划分业务功能,可以参考的方式:

Tips

记录我对于Linux的学习,从磁盘相关的命令开始:

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

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

mkdir 命令用于子目录,常用参数有:

  1. -p 确保目录名称存在,不存在的就建一个

  2. -v 打印每个创建的目录,最好与-p一起使用

rmdir 删除空的目录,常用的参数有:

  1. -p 当子目录被删除后使它也成为空目录的话,则顺便一并删除副目录

  2. -v 打印每个删除的目录,最好与-p一起使用

# 没有-p参数,且父目录不存在,会报错
mkdir a/b
mkdir: 无法创建目录 “a/b”: 没有那个文件或目录
mkdir -pv a/b
mkdir: 已创建目录 'a'
mkdir: 已创建目录 'a/b'
# 不能删除非空目录
rmdir a
rmdir: 删除 'a' 失败: 目录非空
rmdir -pv a/b
rmdir: 正在删除目录 'a/b'
rmdir: 正在删除目录 'a'

Share

分享最近对计算机基础的复习,这次分享的是信息的表示与存储 - 整数的运算,可能会有不足之处,之后会根据理解继续修改。

参考资料

  1. gnu-mkdir

  2. gnu-rmdir

发布于: 21 小时前 阅读数: 12
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

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