法一,自己想的
使用一个复合结构的 List<ArrayList<String>>
来存储每一行的字母,最后按序输出。
使用flag
来判断到底放到哪一行上去。flag按照:0–1–2–1–0–1–2这样变化,实现躺着的Z字形。
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
StringBuilder sb = new StringBuilder();
// use three arrayList
List<ArrayList<String>> xxx = new ArrayList<>();
for (int i = 0; i < numRows; i++) {
xxx.add(new ArrayList<>());
}
int flag = 0;
int zj = 1; // 0-1-2-1-0
int cnt = 0; // record the index of String s
while (cnt < s.length()) {
char ch = s.charAt(cnt);
ArrayList<String> strs = xxx.get(flag);
strs.add(ch + "");
xxx.set(flag, strs);
if(flag == numRows - 1) {
zj = -1;
}
if(flag == 0){
zj = 1;
}
flag += zj;
cnt++;
}
for(int i = 0; i < numRows; i++) {
ArrayList<String> strs = xxx.get(i);
for (String str : strs) {
sb.append(str);
}
}
return sb.toString();
}
很慢
方法二
采用StringBuilder[]
代替上文的嵌套List,优化了一下开头
public String convert2(String s, int numRows) {
int n = s.length(), r = numRows;
if (r == 1 || r >= n) {
return s;
}
StringBuilder[] sbs = new StringBuilder[n];
for (int i = 0; i < numRows; i++) {
sbs[i] = new StringBuilder();
}
int flag = 0;
int zj = 1; // 0-1-2-1-0
int cnt = 0; // record the index of String s
while (cnt < s.length()) {
char ch = s.charAt(cnt);
sbs[flag].append(ch + "");
if(flag == numRows - 1) {
zj = -1;
}
if(flag == 0){
zj = 1;
}
flag += zj;
cnt++;
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < numRows; i++) {
sb.append(sbs[i]);
}
return sb.toString();
}