Leetcode第六题 Z字形转换 Zigzag Conversion

141 阅读1分钟

题目描述:给定一个字符串,将字符串按照Z字形输出指定的行数。

Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P     I    N
A   L S  I G
Y A   H R
P     I

解题思路:本题是按照一定的规则,按列输出值。如果把整个输出结果映射到一个二维数组上,那我们只需要确认每个坐标是否需要输出值,然后按照这个思路,找到对应的逻辑。 这里有两个需要考虑的点:

1 全值列的位置:全值列是指全部有值的列,两个全值列之间的字符数量是2*(numRows-1)个,第一列一定是全值列,那么每一行第一个值就是当前s.indexOf(当前行号),当前行后面的全值列在字符串中的下标就是 行号+2*(numRows-1),依次递增。

2 两个全值列中间的值:全值列的index-i*2,这个规则很好找,两个值相之间当与一个A字形结构。

class Solution {
    public String convert(String s, int numRows) {
        if(s.length() <= numRows || numRows==1){
            return s;
        }
        StringBuilder builder=new StringBuilder();
        //全数值列之间的字符数量
        int step=2*(numRows-1);
        //按行取数
        for(int i=0 ; i<numRows ; i++){
            //初始坐标
            int k=0;
            //计算下当前位置对应字符串的下标
            int index=k * step +i;
            //如果下标还在字符串的长度内,添加到结果集
            while(index <s.length()){
                builder.append(s.charAt(index));
                //计算下一个全值列的在字符串中的下标
                k++;
                index=k * step +i;
                //判断当前列和下一个全值列之间,是否有需要打印的字符
                //边界条件是,i不是第一行,也不是最后一行
                if(i>0 && i< numRows-1){
                    //计算下中间数据的下标,就是下一个下标减去2*i
                    int mid=index - i*2;
                    if(mid < s.length()){
                        builder.append(s.charAt(mid));
                    }
                }
            }
        }
        return builder.toString();
    }
}

运行结果: Runtime: 4 ms, faster than 91.63% of Java online submissions for Zigzag Conversion.

Memory Usage: 44.8 MB, less than 50.32% of Java online submissions for Zigzag Conversion.