将字符串 "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
解法:
numRows =3 字符在字符串s中位置间隔
P A H N 4
A P L S I I G 2
Y I R 4
numRows = 4
P I N 6
A L S I G 4,2 交替
Y A H R 2,4 交替
P I 6
//Z字型 可以现画图,找规律。
public String convert(String s, int numRows) {
//特殊情况 字符串为1或为空,字符串长度小于numRows,numRows=1
if(s.length()==1||s.length()<numRows||s.isEmpty()||numRows==1) {
return s;
}
StringBuffer sb = new StringBuffer();
int t = (numRows-1)*2; //第一行字符串s中两字符之间间隔
int temp = (numRows-1)*2;//第一行字符串s中两字符之间间隔,后续每行减2,并且间隔在temp和(t-temp)之间切换
for(int i=0;i<numRows;i++) {//一共numRows行
if(temp==t) {//第一种情况,第一行
for(int j=0;j<s.length();j=j+temp) {
sb.append(s.charAt(j));
}
}else if((temp)==t/2){//第二种情况,当numRows为奇数时,例如5,中间就有3是个特殊情况,这时((temp)==t/2)
int g = (numRows+1)/2-1;
for(;g<s.length();g=g+temp) {
sb.append(s.charAt(g));
}
}else if(temp==0){//最后一行
for(int k=numRows-1;k<s.length();k=k+t) {
sb.append(s.charAt(k));
}
}else {//字符之间间隔有两种,交叉进行
int t1 = temp;
int t2 = t-temp;
int k =1;
int start = (t-temp)/2;
for(;start<s.length();k++) {
if(k%2==1) {
sb.append(s.charAt(start));
start = start+t1;
}
if(k%2==0) {
sb.append(s.charAt(start));
start = start+t2;
}
}
}
temp = temp-2;
}
String out = sb.toString();
return out;
}