The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
And then read line by line: "PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGY
将给定的字符串以“Z”行书写,如图所示。根据输入的字符串和行数做如下变换:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGY
分析
这个题看懂题意是关键。主要是提取相应位置的坐标,组成新的字符串
-
行数n=2时
-
行数n=3时
-
行数n=4时
根据上面三幅图分析,分为如下几个步骤:
- 红色部分字符个数为
2n-2
(其中n为行数) - 每个列间相邻的两个字符的索引数相差
2n-2
(暂时不管斜线上的字符) - 看斜线上的字符,索引总是
j+(2n-2)-2i
(其中j为列索引,i为行索引,需要联系下面代码for循环中理解)
java代码
public class Solution {
public String convert(String s, int numRows) {
int s_length = s.length();
if (s_length <= numRows || numRows == 1) return s;
char[] result = new char[s_length];
int size_1 = 2 * numRows - 2;//向下数size_1个字符即为要添加到result中的字符
int count = 0;
for (int i = 0; i < numRows; i ++) {//表示行
for (int j = i; j < s_length; j += size_1) {//表示列
result[count ++] = s.charAt(j);
if (i != 0 && i != numRows - 1) {//如果不是第一行和最后一行
int temp = j +size_1 -2 * i;//下一个要加入result中的字符索引
if (temp < s_length) {
result[count ++] = s.charAt(temp);//不能超过字符的长度
}
}
}
}
return new String(result);
}
}