题目 and example:
题目大意:
给一个字符串,需要将这个字符串按照“|/|”这样的顺序排列,然后按行再将字符串合并。
思路:
- 每一组 V 字形的长度为 size = 2 * line - 2 (斜向上的部分没有第一行和最后一样的元素),line 是行数
- 对于垂直向下的一列元素来说,每一组向下的列之间间隔 size 大小,即一组元素的个数。
- 对于斜向上的元素来说,它们的位置位于当前组 size - i(i 为该元素所在的行数,一组有 size 个字符,倒数第 i 个,位置为 size - 1)。当前组的第一个字符所在位置为 j - i (j 为与斜向上的元素同在一行的,垂直向下的列的元素在字符串中的序号,i 为它们共同的行号)。
即:j-i就是zigzag的起始字符,然后我们是要倒数第i个,因为一个zigzag有size个字符,所以倒数第i个就是size-i,我们要赋值的字符就是(j-i)+(size-i)=j+size-2*i
代码:
class Solution {
public String convert(String s, int numRows) {
if(s == null || s.length() == 0 || numRows <= 0)
return "";
if(numRows == 1 || s.length() == 1) return s;
StringBuilder ans = new StringBuilder();
int size = numRows * 2 - 2;
for(int i = 0 ; i < numRows ; i++) {
for(int j = i ; j < s.length() ; j += size) {
ans.append(s.charAt(j));
if(i != 0 && i != numRows - 1 && j + size - i * 2 < s.length()){
ans.append(s.charAt(j + size - i * 2));
}
}
}
return ans.toString();
}
}