首页 > 代码库 > Leetcode: ZigZag Conversion

Leetcode: ZigZag Conversion

一道数学题,参考了网上的思路,先计算一下每一个zig包含的字符个数,实际上是zigSize = nRows + nRows – 2
然后一行一行的加s中的特定元素就行。
第一行和最后一行都只需要加一个字符,每一个zig,而且在s中的index间隔是zigSize。
中间每一行需要添加两个字符到结果中去。第一个字符同上;第二个字符和前面添加这个字符在s上的inde相差正好是zigSize – 2*ir。ir是行index。

有一些细节需要注意:写循环结束条件时候要小心,如果这时候base已经超过了s.length(), 但是base - 2* i 还没有超过, i 是行数,这样就有可能漏掉 base - 2 * i 这种情况

 1 public class Solution {
 2     public String convert(String s, int nRows) {
 3         if (nRows == 1) return s;
 4         StringBuffer res = new StringBuffer();
 5         int zigsize = 2 * nRows - 2;
 6         int base = 0;
 7         for (int i = 0; i <= nRows - 1; i++) {
 8             for (base = i; ; base += zigsize) {
 9                 if (i == 0 || i == nRows - 1) {
10                     if (base >= s.length()) break;
11                     res.append(s.charAt(base));
12                 }
13                 else if (i > 0 && i < nRows - 1) {
14                     int t = base - 2 * i;
15                     if (t > 0 && t < s.length()) res.append(s.charAt(t));
16                     if (base >= s.length()) break;
17                     res.append(s.charAt(base));
18                 }
19             }
20         }
21         return res.toString();
22     }
23 }