Understand the patterns in zigzag.

```
A G
B F H
C E I
D J
```

Row 0: the gap between A-G is 6 so it goes 6-6-6-6

Row 1: the gap between B-F-H is 6 so it goes 4-2-4-2

Row 2: the gap between C-E-I-K is 6 so it goes 2-4-2-4

Row 3: the gap between D-J is 6 so it goes 6-6-6-6

The gap in the top(6) is (nRow-1) * 2 so the example above nRow=4, gap = 6. Each index jumps to next with this pattern (gap - prev jump). The only thing to be careful is that when the jump becomes 0 which will not jump to the next.

```
def convert(self, s, numRows):
if numRows == 1 or len(s) <= numRows:
return s
row = 0
ret = []
# Get the gap
gap = (numRows -1) * 2
while numRows > 0:
count = 1
subJump = (numRows -1) * 2
# make sure there is 0 jump
if (subJump == 0):
subJump = gap
start = row
ret.append(s[row])
# move to next pattern 4-2-4-2-4-2
while len(s) > (start + subJump):
ret.append(s[start + subJump])
start += subJump
subJump = gap - subJump
# make sure there is 0 jump
if (subJump == 0):
subJump = gap
numRows -= 1
row += 1
return ''.join(ret)
```