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
确定好列的数量,(行数可以是1,测试数据的字符串长度可以为零)
字符串数量为0,直接返回空字符串;为1,返回原字符串。
掌握好规律:可以当成一个周期(一行数numRows加m个数)的循环填入。
java的code:
class Solution {
public String convert(String s, int numRows) {
int len = s.length();
if(len == 0) {
return "";
}
if(numRows == 1) {
return s;
}
int m = numRows - 2;
int numRows_m = numRows + m;
String resultString = "";
int lie = len/(numRows_m)*(1+m );
if(len%numRows_m != 0 ) {
if(len%numRows_m <= numRows){
lie++;
}else{
lie = lie + m+1;
}
}
Character [][] arr = new Character[numRows][lie];
for(int i = 0; i < numRows; i++) {
for(int j = 0; j < lie; j++) {
arr[i][j] = ' ';
}
}
char [] arr2 = s.toCharArray();
int num = len / numRows + 1;
int arr2_i = 0;
for(int i = 0; i < num; i++) {
for(int j = 0; j < numRows; j++) {
arr[j][i *(m+1)] = arr2[arr2_i++];
if(arr2_i == len){
break;
}
}
if(arr2_i == len){
break;
}
int p = 1;
for(int j = numRows -2; j > 0; j--){
//System.out.println(j + " " +i*(m+1)+ p+ " " + arr2_i);
arr[j][i*(m+1)+ p] = arr2[arr2_i++];
if(arr2_i == len) {
break;
}
p++;
}
if(arr2_i == len) {
break;
}
}
StringBuilder sBuilder = new StringBuilder();
for(int i = 0; i < numRows; i++) {
for(int j = 0; j < lie; j++) {
// System.out.print(arr[i][j] + " ");
if(arr[i][j] != ' ') {
sBuilder.append(arr[i][j]);
}
}
// System.out.println();
}
return sBuilder.toString();
}
}