Z字形变换
自己实现的代码如下:
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(); } }