文章目录
- 题目描述
- 解题 & 代码
- 二维数组
- ArrayList && StringBuilder
题目描述
- 这题目有点搞,理解题意得时候直接结合给的例子比较好。
- 本质就是:从顶部开始,往下逐个走;到底了就反向,往上逐个走;以此类推直到结束。
- 上面的本质是只考虑了竖直方向的情况,至于水平方向,因为最终结果实际上只需要是按序的即可,对中间用于构成Z的空内容实际上不影响。
解题 & 代码
二维数组
- 起初想到的方法,通过构造二维数组把整个Z字完全复现。
- 可以跑出结果,但是复杂度比较高O(n2n^2n2)
- 这里就不贴了= =,没啥意义
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),每个字符占一个空间