将字符串 "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
这个题有毒,看了很多遍没看懂什么意思,Z字形??后来才发现这根本就不是Z字形,明明是Z旋转90度后在镜像对称。
按这个顺序排列字符串,排列好后再按逐行的顺序转换为字符串。
思路还是很清晰,先根据给定的行数构造一个二维数组,然后按照Z字形填递增的数字,最后遍历这个数组根据String.charAt(),输出字符串就行
public String convert(String s, int numRows) {
if(numRows==1||s.equals(""))return s;
StringBuilder sb=new StringBuilder();
int[][] a=new int[numRows][s.length()];
//j代表行数,i代表列数,k代表字符串的长度
for(int i=0,k=-1,j=-1;k<s.length()-1;) {
if((j+1)%numRows!=0||k==-1) {
a[++j][i]=++k;
}else {
while(j>0&&k<s.length()-1) {
a[--j][++i]=++k;
}
}
}
sb.append(s.charAt(0));
for(int[]c:a) {
for(int d:c) {
if(d!=0)sb.append(s.charAt(d));
}
}
return sb.toString();
}