将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
示例:
输入:s = “PAYPALISHIRING”, numRows = 4
输出:”PINALSIGYAHRPI”
解释:
P I N
A L S I G
Y A H R
P I
思路如下:
/**
* 6. Z 字形变换
* 解法1
* @param s
* @param numRows
* @return
*/
public String convert(String s, int numRows) {
int len = s.length();
if(numRows==1 || numRows>=len) return s;
//每个z周期的元素数
int t = numRows*2-2;
StringBuilder ans = new StringBuilder();
//模拟Z遍历矩阵的行
for(int i=0; i<numRows; i++){
//找到每个周期开始的位置
for(int j=0; i+j<len; j+=t){
//每个周期中同一行会有两个元素出现,先找到第一个元素
ans.append(s.charAt(i + j));
//再找到第二个元素,第一行和最后一行只会出现一次,所以排除
//并且考虑不超过原字符串长度
if(0<i && i<numRows-1 && j+t-i<len){
ans.append(s.charAt(j + t - i));
}
}
}
return ans.toString();
}
//解法2: 用一维字符串数组存储每一行字符,然后拼接起来
public String convert1(String s, int numRows) {
if(numRows==1) return s;
int len = s.length();
String[] strArr = new String[numRows+1];
for(int i=0; i<=numRows; i++){
strArr[i]="";
}
int cnt = 1;
int j = 0;
while(j<len){
while(cnt<=numRows && j<len){
strArr[cnt++]+=s.charAt(j++);
}
cnt-=2;
while(cnt>1 && j<len){
strArr[cnt--]+=s.charAt(j++);
}
}
String res = "";
for(int i=1; i<=numRows; i++){
res += strArr[i];
}
return res;
}