ARTS 第 6 周

每周一道算法、点评一篇英文技术文章、学习一个技术技巧、分享一个技术观点和思路

Algorithm

Problem: ZigZag Conversion

思路 1

定义一个二维数组,记录字符串的走势

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
class Solution {
public String convert(String s, int numRows) {
int length = s.length();
if (length < numRows || numRows < 2) {
return s;
}
int[][] ints = new int[numRows][length];
int j = 0, incr = 1;
for (int i = 0; i < length; i++) {
ints[j][i] = 1;

if (j == 0) {
incr = 1;
}

if (j == numRows - 1) {
incr = -1;
}
j += incr;
}

StringBuilder sb = new StringBuilder();
for (int i = 0; i < numRows; i++) {
for (int k = 0; k < length; k++) {
if (ints[i][k] == 1) {
sb.append(s.charAt(k));
}
}
}

return sb.toString();
}
}

思路 2

一行一行的访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
StringBuilder sb = new StringBuilder();
int length = s.length();
int cycleLen = 2 * numRows - 2;// 头尾只有一个
for (int i = 0; i < numRows; i++) {

for (int currentCycle = 0; currentCycle + i < length; currentCycle += cycleLen) {
sb.append(s.charAt(currentCycle + i));
//不是头尾两行的情况,同一个周期里面,有两个值在同一行
if (i != 0 && i != numRows - 1 && currentCycle + cycleLen - i < length)
sb.append(s.charAt(currentCycle + cycleLen - i));
}
}
return sb.toString();
}
}

Review

最近看了《编程珠玑》,果然经典的书就是经典,值得一看,且得多看几遍。

虽然只看了前面几章,但是给我了不少的启发。

编程时,需要明确问题、找到合适的数据结构和算法、使用简单的设计。

而这需要扎实的基础,尽量的压榨每一个字节,所以夯实基础是重点,这也是我一直的目标。

Tip

现在使用 Spring Boot 写一个 Filter 很简单,实现 javax.servlet.Filter 再加上 @WebFilter 注解,通过 urlPatterns 配置 Filter 的应用范围。还可以通过 @Order 指定顺序。最后加上 @ServletComponentScan 扫描这个 Filter

我在配置 urlPatterns 遇到一个坑,就是使用 /** 是无效的,只有 *

/order/* 表示以 /order/ 开始的 URL。

/*.do 表示以 .do 结尾的 URL。

注意:urlPatterns 中的字符串除了 * 都是全匹配(大小写,长度)。

Share

最近遇到了一些事情,发现自己的心态炸了,太容易被别人点燃了。得好好地控制心态,这又是一门得好好锻炼的事情。为人处世还是挺重要的,要做一个高情商的人。有时还得学习下阿Q精神。

暂时的办法是,不要被别人的情绪影响,在气头上的时候,冷静下来,也尽量用诙谐幽默的话让对方也冷静下来,脸皮厚一点。

二是控制自己的脾气,控制语气,不要把负面情绪传递给别人。

(完)