将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R E T O E S I I G E D H N 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:”LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows); 示例 1:
输入: s = “LEETCODEISHIRING”, numRows = 3 输出: “LCIRETOESIIGEDHN” 示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4 输出: “LDREOEIIECIHNTSG” 解释:
L D R E O E I I E C I H N T S G
找到每一行的元素位置
- 要求分为n行,i为当前行,j为当前列
- 每一行的主元素位置是j(2n - 2) + i
每一行分支元素位置是(j + 1)(2n - 2) - i ```java public class Convert {
public String convert(String s, int numRows) { //所有元素在一行 if (numRows <= 1) {
return s;
} int temp = 2 * numRows - 2; //当前行 int i = 0; //当前列 int j = 0; int count = 0; char[] chars = new char[s.length()]; while (i < numRows) {
//主要元素 int aIndex; while ((aIndex = j * temp + i) < s.length()) { chars[count++] = s.charAt(aIndex); //分支元素 int bIndex = (j + 1) * temp - i; //第0行,最后一行没有分支元素 if (bIndex < s.length() && i != 0 && i != numRows - 1) { chars[count++] = s.charAt(bIndex); } j++; } i++; j = 0;} return String.valueOf(chars); } }
2. 每一行创建一个容器,按顺序放入元素
```java
public class Convert {
public String convert(String s, int numRows) {
//所有元素在一行
if (numRows <= 1) {
return s;
}
int n = Math.min(numRows, s.length());
//创建容器保存每一行的元素
List<StringBuilder> stringBuilders = new ArrayList<>(n);
for (int i = 0; i < n; i++) {
stringBuilders.add(new StringBuilder());
}
int next = 0;
boolean flag = false;
//按照Z的顺序放入元素
for (int i = 0; i < s.length(); i++) {
stringBuilders.get(next).append(s.charAt(i));
//翻转方向
if (next == 0 || next == n - 1) flag = ! flag;
next += flag ? 1 : -1;
}
StringBuilder ret = new StringBuilder();
stringBuilders.forEach(ret::append);
return ret.toString();
}
}
