- 题目链接
- 题意
- 解题思路
- 思路一
- 建立min(numRows, s.length())个StringBuilder模拟
- 思路二
- 利用Z形重排后下标的数学关系直接得出重排后的字符串, 我们可以观察得到这样的规律, 如下图, P与I, A与S, S与G的差值都是numRows * 2 – 2, 第二行A与L, S与I的差值都是(numRows * 2 – 2) – (2 * 1), 同理下一行是(numRows * 2 – 2) – (2 * 2)
- AC代码
class Solution {
public String convert(String s, int numRows) {
if(s.length() == 0 || numRows == 1) return s;
char[] chars = s.toCharArray();
StringBuilder[] anStringBuilders = new StringBuilder[Math.min(numRows, s.length())];
boolean check = false;
int idx = 1;
for(int i = 0; i < s.length(); ++i) {
idx += check ? 1 : -1;
if(anStringBuilders[idx] == null) anStringBuilders[idx] = new StringBuilder();
anStringBuilders[idx].append(chars[i]);
if(i % (numRows - 1) == 0) check = !check;
}
StringBuilder ans = new StringBuilder(s.length());
for (StringBuilder stringBuilder : anStringBuilders) {
ans.append(stringBuilder);
}
return ans.toString();
}
}
class Solution {
public String convert(String s, int numRows) {
int length = s.length();
if(numRows > length || numRows <= 1)
return s;
char[] zigZagChars = new char[length];
int count = 0;
int interval = 2 * numRows - 2;
for(int i = 0; i < numRows; i++){
int step = interval - 2 * i;
for(int j = i; j < length; j += interval){
zigZagChars[count] = s.charAt(j);
count++;
if(step > 0 && step < interval && j + step < length){
zigZagChars[count] = s.charAt(j + step);
count++;
}
}
}
return new String(zigZagChars);
}
}