题目描述
- 这题目有点搞,理解题意得时候直接结合给的例子比较好。
- 本质就是:从顶部开始,往下逐个走;到底了就反向,往上逐个走;以此类推直到结束。
- 上面的本质是只考虑了竖直方向的情况,至于水平方向,因为最终结果实际上只需要是按序的即可,对中间用于构成Z的空内容实际上不影响。
解题 & 代码
二维数组
- 起初想到的方法,通过构造二维数组把整个Z字完全复现。
- 可以跑出结果,但是复杂度比较高O( n 2 n^2 n2)
- 这里就不贴了= =,没啥意义
ArrayList && StringBuilder
- 这里是参考了题解里Krahets的做法,感觉有很多可以学习的地方。
- numRows为1的情况,直接返回原串即可。
图片引用自Krahets的题解
class Solution {
public String convert(String s, int numRows) {
if(numRows == 1){
return s;
}
// 初始化链表 & 字符串
List<StringBuilder> lsb = new ArrayList<>();
for (int i = 0; i < numRows; i++) {
lsb.add(new StringBuilder());
}
// flag是方向,可以反向。
int i = 0, flag = -1;
for(char c : s.toCharArray()){
lsb.get(i).append(c);
// 到头了,需要改方向了
if(i == 0 || i == numRows - 1){
flag = -flag;
}
i += flag;
}
// 生成答案
StringBuilder ans = new StringBuilder();
for (int j = 0; j < numRows; j++) {
ans.append(lsb.get(j));
}
return ans.toString();
}
}
- 时间复杂度:O(n),相当于遍历一次字符串
- 空间复杂度:O(n),每个字符占一个空间