FTPrep, 6 Zigzag conversion

来源:互联网 发布:ios微信无法连接网络 编辑:程序博客网 时间:2024/06/05 19:37

看到这题,第一反应还是第一次做时,特别长的代码和在纸上反复画图找规律的印象。。。

那显然不是应该出现的解法,但是还是很清楚的思路。参靠了之前的算法,代码和思路瞬间清楚,抓住几个关键点,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();    }}