【题目描述】
将字符串 "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
【题目解答】
package com.string;
public class Solution {
public String convert(String s, int numRows) {
int j = 0;
int k = 0;
if (s == null || s.equals("") || numRows < 1|| numRows > Math.pow(2, 31) - 1) {
return "";
}
char[][] temp = new char[numRows][s.length()*2];//多申请一部分列,防止越界
for (int i = 0; i < s.length(); i++) {
temp[j][k] = s.charAt(i);
j++;
if(j >= numRows && j < s.length()) {
int rowindex = numRows - 1;
k++;
i++;
while(rowindex - 1 > 0) {
if (i >= s.length())
{
break;
}
rowindex--;
j = rowindex;
temp[j][k] = s.charAt(i++);
}
j = 0;
k++;
i--;
}
}
StringBuilder bs = new StringBuilder();
if (numRows == 1) {//如果只有一行,循环的边界要特殊处理
for(int i = 0; i < s.length()*2; i++)
{
if (temp[0][i] != '\0') {
bs.append(temp[0][i]);
}
}
}
else {
for (int i1 = 0; i1 < numRows; i1++) {
for (int i2 = 0; i2 <= k; i2++) {
if (temp[i1][i2] != '\0') {
bs.append(temp[i1][i2]);
}
}
}
}
return bs.toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Solution st = new Solution();
System.out.println(st.convert("A", 1).equals("A"));
System.out.println(st.convert("AB", 1).equals("AB"));
System.out.println(st.convert("ABCDE", 4).equals("ABCED"));
System.out.println(st.convert("PAYPALISHIRING", 3).equals("PAHNAPLSIIGYIR"));
System.out.println(st.convert("PAYPALISHIRING", 4).equals("PINALSIGYAHRPI"));
}
}