题目描述:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(String s,int numRows);
解题思路:
根据题目要求,设置一个二维数组用于存放Z字形排列的字符串,可以如下划分这个Z自行的二维数组,
每个部分包含两列,一列有numRows个元素,一列有numRows-2个元素;所以总的列数可以用s.length()/(numRows-1)表示。第一列从0开始,欧数列从上往下赋值,奇数列从下往上赋值,且第一个元素和最后一个元素不赋值,最后再按从左到右,从上到下的顺序遍历二维数组。
java代码实现如下:
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
//定义列数
int numLines=s.length()/(numRows-1);
int n=0;
char[][] zArray = new char[numRows][numLines];
for (int i = 0; i < numLines && n < s.length(); i++) {
for (int j = 0; j < numRows && n < s.length(); j++) {
if (i % 2 == 0) {
//如果是奇数列
zArray[j][i] = s.charAt(n++);
} else {
//如果是偶数列
if (j > 0 && j < numRows - 1) {
zArray[numRows - j-1][i] = s.charAt(n++);
}
}
}
}
StringBuffer result = new StringBuffer();
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < numLines; j++) {
if (zArray[i][j]!=0) {
result.append(zArray[i][j]);
}
}
}
return result.toString();
}
}