水一下废话,这道题第一次遇到的时候不知道为什么想到的思路是找出数学规律。。。然后就花了很多时间,而且效果不好(太久没动脑,有点动不起来了hhh)。后面看了题解以后才发现其实有十分简单的办法。
解题思路:
- 给每个字符一个行号
- 假定给定行数为num,当行号从1开始,一直递增到num,然后行号从num开始递减至1,然后反复...(其实很有规律对吧🌚)
老规矩,不多讲 show code
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) return s;
// 1. 给每个字符创建对应的行号 2.按照行号输出
char[] chs = s.toCharArray();
// 创建对应行数的动态数组
List[] rows = new ArrayList[numRows];
for (int i = 0; i < numRows ;i ++ ) {
// 初始化arrayList,否则默认为null
rows[i] = new ArrayList();
}
int floor = 1 ;
boolean direct = true;
for (int i = 0;i< chs.length ;i ++) {
rows[floor - 1].add(chs[i]);
if(direct) {
floor ++;
} else {
floor --;
}
// 1到num时候反转
if (floor == 1 || floor == numRows) direct = !direct;
}
StringBuffer sb = new StringBuffer();
for(List list : rows) {
for(int j = 0; j < list.size();j ++) {
sb.append(list.get(j));
}
}
return sb.toString();
}
}
Q.E.D.