自己实现的代码如下:
import java.util.Arrays;
public class Day01 {
public static void main(String[] args) {
String s = convert("LEETCODEISHIRING", 3);
System.out.println(s);
}
public static String convert(String s, int numRows) {
//先把字符串转化为字符数组
char[] char1 = s.toCharArray();
//字符数组先分成n行 逻辑上排成Z字
char[][] char2 = new char[numRows][1024];
//记录每一行字符个数 重新排列完成后 重组成一个数组
int[] charArrLength = new int[numRows];
//Z字的循环规律大小
int scale = 2 * numRows - 2;
for (int i = 0; i < s.length(); i++) {
//一共有两种规则 第一种规则 直线下行
if(scale==0){
//防止scale为零 i%scale抛出异常
scale=1;
}
int position = i % scale;
if (position >= numRows) {
//第二种规则 向上返回
position = (numRows - 1) - ((position % numRows) + 1);
}
/*System.out.println("position "+position);
System.out.println("index"+i);*/
char2[position][charArrLength[position]] = char1[i];
charArrLength[position]++;
}
int count = 0;
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < charArrLength[i]; j++) {
char1[count++] = char2[i][j];
}
}
String result = new String(char1);
return result;
}
}
看了题解答案 有些自愧不如:
import java.util.ArrayList;
import java.util.List;
public class Day01Demo {
public static void main(String[] args) {
String s = convert("LEETCODEISHIRING", 3);
System.out.println(s);
}
public static String convert(String s, int numRows) {
if(numRows < 2) return s;
List<StringBuilder> rows = new ArrayList<StringBuilder>();
for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());
int i = 0, flag = -1;
for(char c : s.toCharArray()) {
rows.get(i).append(c);
if(i == 0 || i == numRows -1) flag = - flag;
i += flag;
}
StringBuilder res = new StringBuilder();
for(StringBuilder row : rows) res.append(row);
return res.toString();
}
}