思路
最初我想用數(shù)學(xué)方法推倒出來(lái)履羞,但是發(fā)現(xiàn)還是有點(diǎn)麻煩的房铭,所以果斷選擇模擬轉(zhuǎn)換過(guò)程还棱。
其實(shí)過(guò)程很簡(jiǎn)單掺出,就是新建n個(gè)Vector徽千,按 1 ~ n 的順序向Vector末尾添加元素苫费,再按n - 1 ~ 2 的順序向Vector末尾添加元素。反復(fù)直到遍歷完字符串双抽。
最后把1 ~ n 個(gè)向量拼接成字符串就可以了百框。
時(shí)間復(fù)雜度分析
一趟遍歷完字符串,所以為O(n)
(直到我看到官方解答用StringBuilder作為每一行元素牍汹,我才知道自己有多l(xiāng)ow)
public static String convert(String s, int numRows){
Vector<Vector<Character>> a = new Vector<>();
for (int i = 0; i < numRows ; i++) {
a.add(new Vector<>());
}
int pointer = 0;
boolean flag = true;
while (flag){
for (int i = 0; i < numRows ; i++, pointer ++) {
if(pointer >= s.length()){
flag = false;
break;
}
a.get(i).add(s.charAt(pointer));
}
for (int i = numRows - 2; i >= 1 ; i --, pointer ++) {
if(pointer >= s.length()){
flag = false;
break;
}
a.get(i).add(s.charAt(pointer));
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i <numRows ; i++) {
for (int j = 0; j < a.get(i).size() ; j++) {
sb.append(a.get(i).get(j));
}
}
return sb.toString();
}
修改后代碼
(注意一開(kāi)始不用數(shù)組是因?yàn)镴ava不能創(chuàng)建泛型數(shù)組铐维,Vector<Character>[] a = new Vector<Character>[numRows]編譯通不過(guò))
public static String convert(String s, int numRows){
StringBuilder[] a = new StringBuilder[numRows];
for (int i = 0; i < numRows; i++) {
a[i] = new StringBuilder();
}
int pointer = 0;
boolean flag = true;
while (flag){
for (int i = 0; i < numRows ; i++, pointer ++) {
if(pointer >= s.length()){
flag = false;
break;
}
a[i].append(s.charAt(pointer));
}
for (int i = numRows - 2; i >= 1 ; i --, pointer ++) {
if(pointer >= s.length()){
flag = false;
break;
}
a[i].append(s.charAt(pointer));
}
}
StringBuilder sb = new StringBuilder();
for (StringBuilder x:
a) {
sb.append(x.toString());
}
return sb.toString();
}