6. Z字形变换

一、题目

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

P   A   H   N
A P L S I I G
Y   I   R

之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

实现一个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"

示例 2:

输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释:

P     I    N
A   L S  I G
Y A   H R
P     I

二、思路

要得到解释后的二维数conStr[numRows][len]; len未知的情况下,找规律

 len = s.length()/ (2*numRows – 2) * (numRows – 1); 

解释一下将一个有完整列的如:PAYP这一列到ISHI这一列,有 numRows – 2个字符,加上完整的一列则为 2*numRows -2个字符 而这种规律递进的行长为 numRows – 1, 当然 len != s.length() / 2; 计算机运算取整!! 

当然还有不规律的,如最后的NG这一列,其判读 otherstr = s.length()% (2*numRows – 2) 

判断他的列数进行相加得到最后的len 那么接下来就填充再取出就好了 

三、代码

public class LeetCode6 {
    public static void main(String[] args){
        String s = "PAYPALISHIRING";
        System.out.println(convert(s,9));
    }
    public static String convert(String s, int numRows) {
        if(numRows == 1 )
            return s;
        int len = s.length() / (2*numRows - 2) * (numRows - 1);
        int otherStr = s.length() % (2*numRows - 2),otherLen = 0;
        if(otherStr != 0 ){
            if(otherStr <= numRows)
                otherLen = 1;
            else
                otherLen = otherStr - numRows + 1;
        }
        len = len + otherLen;
        char conStr[][] = new char [numRows][len];
        int k = 0 , l ,i = 0,j = 0;
        while(k < s.length()){
            //填充完整的一列
            i = 0; l = numRows;
            while(l > 0 && k < s.length()){
                conStr[i][j] = s.charAt(k);
                i++; k++; l--;
            }
            //像右推进一列,行数回归到非完整的起始行
            j++; i = numRows - 2;
            //填充非完整的列
            for(int z = numRows - 2;z > 0;z--){
                if(k < s.length()){
                    conStr[i][j] = s.charAt(k);
                    i--; j++; k++;
                }
            }
        }
        StringBuilder changedStr = new StringBuilder() ;
        for( i = 0 ; i < numRows ; i++){
            for( j = 0 ; j < len ; j++){
                if(conStr[i][j] != '\0'){
                    changedStr.append(conStr[i][j]);
                }
            }
        }
        return new String(changedStr);
    }
}

四、总结

 

点赞