题目描述
样例描述
思路
标记变量巧用 + 模拟行索引变化
- 所给字符串时按Z字型存储的,转换成按指定行的字符串,不难看出,行索引的变化是从0到numRows - 1,然后再变化到0,又到…反复进行的
- 变化的时刻就是第一行和最后一行,此处可以用变量flag来处理
- 递增时,行数加一,递减时,行数减一,因此flag可以设置为1,然后到第一行或者最后一行时将flag取反即可
- 可以提前开好每一行的存储(这里用StringBuilder很方便),然后统一放到一个list里面
- 最后将每一行的结果拼接在一起就是最终答案
代码
class Solution {
public String convert(String s, int numRows) {
List<StringBuilder> rows = new ArrayList<>();
for (int i = 0; i < numRows; i ++ ) {
rows.add(new StringBuilder());
}
if (numRows < 2) {
return s;
}
int r = 0, flag = -1;
for (char c: s.toCharArray()) {
rows.get(r).append(c);
if(r == 0 || r == numRows - 1) {
flag = -flag;
}
r += flag;
}
String res = "";
for (StringBuilder sb: rows) {
res += sb.toString();
}
return res;
}
}
|