将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
之后,输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
String newString = convert(String s, int numRows);
#解题思路
1.首先需要判断输入的行数numRows是否为1,如果是1,则直接返回s即可
2.将输入字符串s转为字符集合,Char[] charc = s.toCharArray();
3.在进行Z字形变换的时候,会存在numRows行,m列,从第一列开始进行遍历,假设数组charc的下表为S0到Sn.
4.第一行第一列为S0,第二行第一列为S1,以此类推,第numRows-1行为S(numRows-1),当填充到最后一行时,此时i=numRows-1(i标识行数),此时需要反向遍历,进行数据填充,此时填充的数据是i-1行的数据。为标识正向填充和反向填充,此时需要引入一个标志位flag,默认为-1,当遍历到第0行和第numRows-1行进行变换,然后i每循环一次i=i+flag,直至输入字符串s遍历结束
5.将所有行的字符串组合起来,就形成最后的输出样式了
package lee;
import java.util.ArrayList;
import java.util.List;
public class Solution6 {
public static void main(String args[]) {
String s = "PAYPALISHIRING";
Solution6 solution = new Solution6();
String newStr = solution.convert(s, 4);
System.out.println(newStr);
}
public String convert(String s, int numRows) {
if (numRows < 2) {
return s;
}
char[] stringChar = s.toCharArray();
List<StringBuffer> list = new ArrayList<StringBuffer>();
for (int i = 0; i < numRows; i++) {
list.add(new StringBuffer());
}
int i = 0;
int flag = -1;
for (char c : stringChar) {
list.get(i).append(c);
if (i == 0 || i == numRows - 1) {
flag = -flag;
}
i = i + flag;
}
StringBuffer newStr = new StringBuffer();
for (StringBuffer str : list) {
newStr.append(str);
}
return newStr.toString();
}
}