[Java][Leetcode middle] 6. Z 字形变换
法一,自己想的
使用一个复合结构的 List<ArrayList<String>>
来存储每一行的字母,最后按序输出。
使用flag
来判断到底放到哪一行上去。flag按照:0–1–2–1–0–1–2这样变化,实现躺着的Z字形。
public String convert(String s, int numRows) {if (numRows == 1) {return s;}StringBuilder sb = new StringBuilder();// use three arrayListList<ArrayList<String>> xxx = new ArrayList<>();for (int i = 0; i < numRows; i++) {xxx.add(new ArrayList<>());}int flag = 0;int zj = 1; // 0-1-2-1-0int cnt = 0; // record the index of String swhile (cnt < s.length()) {char ch = s.charAt(cnt);ArrayList<String> strs = xxx.get(flag);strs.add(ch + "");xxx.set(flag, strs);if(flag == numRows - 1) {zj = -1;}if(flag == 0){zj = 1;}flag += zj;cnt++;}for(int i = 0; i < numRows; i++) {ArrayList<String> strs = xxx.get(i);for (String str : strs) {sb.append(str);}}return sb.toString();}
很慢
方法二
采用StringBuilder[]
代替上文的嵌套List,优化了一下开头
public String convert2(String s, int numRows) {int n = s.length(), r = numRows;if (r == 1 || r >= n) {return s;}StringBuilder[] sbs = new StringBuilder[n];for (int i = 0; i < numRows; i++) {sbs[i] = new StringBuilder();}int flag = 0;int zj = 1; // 0-1-2-1-0int cnt = 0; // record the index of String swhile (cnt < s.length()) {char ch = s.charAt(cnt);sbs[flag].append(ch + "");if(flag == numRows - 1) {zj = -1;}if(flag == 0){zj = 1;}flag += zj;cnt++;}StringBuilder sb = new StringBuilder();for(int i = 0; i < numRows; i++) {sb.append(sbs[i]);}return sb.toString();}