看到这题,第一反应还是第一次做时,特别长的代码和在纸上反复画图找规律的印象。。。
那显然不是应该出现的解法,但是还是很清楚的思路。参靠了之前的算法,代码和思路瞬间清楚,抓住几个关键点,1分钟搞定,关键还是要有画面感
1,看出重复区的大小是 jump = (2*rowNums - 2),这个是非常显而易见且有用的。visualization的话就是,每一个这个大小的substring 从水平变成了竖直方向,这样从一条线变成了一个矩阵。虽然不是矩阵,但是有明显的规律可循。
2,对于斜着网上走的那一段,任然需要visualization了。这个斜上方走的情况只出现在第一行和最后一行的中间部分,对于index j 的这个往下走的左边,它右边的字母的坐标有没有一个通项公式呢?有的!那就是 j+ jump - 2*i !!! 这个公式非常 犀利,有了这个公式,代码就好写了。
3,对于每一个要作为 index的变量都要用 < len 来限制。
代码清晰入下:
public class Solution {
public String convert(String s, int numRows) {
int len = s.length();
if(len==0 || numRows<=0) return "";
if(numRows==1) return s;
StringBuilder result= new StringBuilder();
int jump = 2*numRows - 2;
for(int i=0; i<numRows; i++){
for(int j=i; j<len; j+=jump){
result.append(s.charAt(j));
if(i!=0 && i!=numRows-1 && (j+jump-2*i)<len){
result.append(s.charAt(j+jump-2*i));
}
}
}
return result.toString();
}
}