LeetCode6Z字形转换

题目:

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:(下面这样的形状)

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

之后按逐行顺序依次排列:"PAHNAPLSIIGYIR"

 

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

string convert(string text, int nRows);

convert("PAYPALISHIRING", 3) 应当返回 "PAHNAPLSIIGYIR" 。

分析:

将字母排成Z形状(Z竖起来),比如:

ABCDEFGHIGKLMNO 5:

A                             I

B                    H      J             

C           G               K                    O

D    F                       L         N

E                             M

然后按照第一行到最后一行再组成新的字符串:AIBHJCGKODFLNEM

找一下规律 : 第一行和最后一行的字母下标数(下标数从0开始)可以看成一个等差数列,中间的几行也有规律。把满列的和单列的分成两部分来看,满列的按等差数列来做,单列的用单列的规律加进去。详细的看代码,应该可以理解。


代码:

class Solution {
    public String convert(String s, int numRows) {
        int len = s.length();
        int nodeLen = 2*numRows-2;//两整列之间的差 也就是等差数列中的d
        String result = "";

        if (len == 0 || numRows == 0 || numRows == 1)//特殊情况特殊处理
            return s;

        for (int i = 0; i < numRows; i++)//从第一行遍历到最后一行
            for (int j = i; j < len; j += nodeLen) {
                result += s.charAt(j);//第一行和最后一行 还有普通行的整列数字
                if (i != 0 && i != numRows-1 && j - 2*i + nodeLen < len)
                    result += s.charAt(j - 2*i + nodeLen);//单列行的数字
            }

        return result ;
    }
}

你可能感兴趣的:(算法)