nRows = 2 0 2 4 6 8 1 3 5 7 9
nRows = 3 0 4 8 12 16 1 3 5 7 9 11 13 15 2 6 10 14
nRows = 4 0 6 12 18 1 5 7 11 13 17 19 2 4 8 10 14 16 3 9 15
可以发现规律
1. 一块区域,即一个类似于“v”的形状为一个区域,区域的size是nRows*2-2;
2. 在每一个区域中,只有第一行和最后一行有一个数,其余行每行包含两个数;
3. 在除第一行和最后一行的其余行,第二个数和第一个数的差距是size-i*2。
上代码
class Solution { public: string convert(string s, int nRows) { // Start typing your C/C++ solution below // DO NOT write int main() function if (nRows <= 1) return s; int zigSize = nRows * 2 - 2; string rst = ""; for (int i = 0; i < nRows; i++) { for (int j = i; j < s.length(); j += zigSize) { rst += s[j]; if (i > 0 && i < nRows - 1) { if (j+zigSize-2*i < s.length()) rst += s[j+zigSize-2*i]; } } } return rst; } };