前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

1、Z字形变换

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

示例 1:

输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"

L   C   I   R
E T O E S I I G
E   D   H   N

示例 2:

输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L     D     R
E   O E   I I
E C   I H   N
T     S     G

1.1、解题思路

画好图形,看看就知道怎么解决了

1.2、算法


    public String z(String s, int numRows){
        int length = s.length();
        if (length <= numRows || numRows == 1){
            return s ;
        }

        //先打印第一行的数据
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(s.charAt(0)) ;
        int initWidth = (numRows -1 ) * 2 ;
        int j = initWidth ;
        for ( ; j < length; j += initWidth){
            stringBuilder.append(s.charAt(j)) ;
        }


        //从第二行开始
        for (int i = 1; i < numRows ; i++) {
            stringBuilder.append(s.charAt(i)) ;
            int width = initWidth - (i * 2);
            if (width != 0) {
                  j = i + width ;
                for ( ; j < length; j +=  width){
                    stringBuilder.append(s.charAt(j)) ;
                    width = initWidth - width ;
                }
            } else {
                 j = i + initWidth ;
                for ( ; j < length; j += initWidth){
                    stringBuilder.append(s.charAt(j)) ;
                }
            }
        }

        return stringBuilder.toString();
    }

1.3、测试

@Test
public void test(){
    System.out.println(z("AB", 1));
}


ContactAuthor