题目:
将字符串 "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 ;
}
}