# LeetCode: ZigZag Conversion

Datetime:2016-08-23 01:21:06         Topic: LeetCode          Share        Original >>

## Previous post

This is the old post on this question, using another method.

## Question

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 text, int nRows);
convert("PAYPALISHIRING", 3) //should return "PAHNAPLSIIGYIR".```

## Analyze

This question is simple, one method is that build strings for each row, and for each char in the string, determine the target row of the position based on the total row count, and append it to the target string. Then concat all the strings together in the last.

## The fast ruby version

```# @param {String} s
# @param {Integer} num_rows
# @return {String}
def convert(s, num_rows)
result = []
tail_size = num_rows > 2 ? num_rows - 2 : 0
group_size = num_rows + tail_size

s.length.times do |i|
in_group_position = i % group_size
target_row = if in_group_position < num_rows
in_group_position
else
num_rows - 1 - (in_group_position - num_rows)
end
result[target_row] ||= ""
result[target_row] << s[i]
end

result
end```