题目
直接上推荐解法
思路分析
给定的字符串相当于像刷漆一样从上刷到下再刷到上,什么时候没漆了(字符串到末尾了),什么时候就完事了,
创建不同的字符串容器,每一行创建一个,相当于在墙上画不同的横线,字符串在上下来回刷的过程中,落在哪个格子就放在哪个格子里,然后最后按照格子的顺序一行一行输出。
import java.util.ArrayList;
import java.util.List;
class Solution {
public String convert(String s, int numRows) {
/**
* 下面判断要是行数是1行那就不用操作直接返回了
*/
if (numRows < 2) return s;
/**
* 开始正式操作 新建一个list, 里面创建几个空StringBuilder对象用来保存字符 具体创建StringBuilder个数就是行数
*/
List<StringBuilder> rows = new ArrayList<StringBuilder>();
for (int i = 0; i < numRows; i++) {
rows.add(new StringBuilder());
}
/**
* i是计数器 从0开始, flag可以看成是方向指针 通过取反可以调转方向
*/
int i = 0, flag = -1;
for (char c : s.toCharArray()) {
rows.get(i).append(c);
/**
* 这里一开始i是0,先把第一个字符放到第0行的StringBuilder里
* 下面判断了一下i是否是0或者行数-1,这两个数说明到两头了,需要取反flag实现转向
* 因为我们从0开始,而0又是应该在一会取反的,所以刚才非常!!!巧妙地!!!把flag初始值设置成了-1!!!
* 这样第一个字符串存进去以后,flag是正的,继续往前走
*/
if (i == 0 || i == numRows - 1) {
flag = -flag;
}
i += flag;
}
/**
* 下面就是字符串的拼接
*/
StringBuilder res = new StringBuilder();
for (StringBuilder row : rows) {
res.append(row);
}
return res.toString();
}
}
我本来想用字符串数组的 char[ ] ,把StringBuilder给忘了,常用API还是要牢记啊