1.Description
The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line: “PAHNAPLSIIGYIR”
Write the code that will take a string and make this conversion given a number of rows:
string convert(string s, int numRows);
2. TC
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P I N
A L S I G
Y A H R
P I
Example 3:
Input: s = "A", numRows = 1
Output: "A"
3.Solution
public String convert(String s, int numRows) {
if(numRows == 1)
return s;
List<StringBuilder> ans = new ArrayList<>();
for (int i = 0; i <= Math.min(numRows, s.length()); i++) {
ans.add(new StringBuilder());
}
boolean goingDown = false;
int curRow = 0;
for(char c : s.toCharArray()) {
ans.get(curRow).append(c);
if (curRow == 0 || curRow == numRows -1)
goingDown = !goingDown;
curRow += goingDown ? 1 : -1;
}
StringBuilder sb = new StringBuilder();
for(StringBuilder chars: ans){
sb.append(chars);
}
return sb.toString();
}
思路:
然后用一个list存放每一行的内容,每一行的内容是不连贯,因此用StringBuilder来拼接字符串。
然后根据重上倒下还是重下到上的方向来决定是在哪一行。
最后把所有StringBuilder拼接成一个完整的字符串。
public String convert(String s, int numRows) {
if(numRows == 1)
return s;
StringBuilder sb = new StringBuilder();
int n = s.length();
int df = 2*numRows -2;
for (int i = 0; i < numRows; i++) {
for (int j = 0; j + i < n; j+=df ) {
sb.append(s.charAt(i + j));
if (i != 0 && i != numRows - 1 && j -i +df < n) {
sb.append(s.charAt(j - i + df));
}
}
}
return sb.toString();
}
逐行读取Z字形的内容,要算出两个点之间的差值,找到其规律。
P I N
A L S I G
Y A H R
P I
以上图为例,第一行的三个字符P, I, N,在原字符串中下标分别为0, 6, 12,差值为6,这个值和行数有关,3行差值为4,得出的规律是2* 行数-2;
对于中间的行数,就是j-i+df