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 s, int numRows);
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3 Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4 Output: "PINALSIGYAHRPI" Explanation: P I N A L S I G Y A H R P I
Example 3:
Input: s = "A", numRows = 1 Output: "A"
JAVA
public class ZigZag_Conversion {
public class Solution {
public String convert(String s, int nRows) {
if (s == null || s.length() <= nRows || nRows == 1) {
return s;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nRows; i++) {
if (i == 0 || i == nRows - 1) {
int index = i;
while (index < s.length()) {
sb.append(s.charAt(index));
index += 2 * (nRows - 1);
}
} else {
int index = i;
while (index < s.length()) {
sb.append(s.charAt(index));
if (index + 2 * nRows - 2 * i - 2 < s.length()) {
sb.append(s.charAt(index + 2 * nRows - 2 * i - 2));
}
index += 2 * (nRows - 1);
}
}
}
return sb.toString();
}
}
}
############
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
StringBuilder ans = new StringBuilder();
int group = 2 * numRows - 2;
for (int i = 1; i <= numRows; i++) {
int interval = i == numRows ? group : 2 * numRows - 2 * i;
int idx = i - 1;
while (idx < s.length()) {
ans.append(s.charAt(idx));
idx += interval;
interval = group - interval;
if (interval == 0) {
interval = group;
}
}
}
return ans.toString();
}
}
C++
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1) return s;
int N = s.size(), d = (numRows - 1) * 2;
string ans;
for (int i = 0; i < numRows; ++i) {
int w = 2 * i;
for (int j = i; j < N;) {
ans += s[j];
w = d - w;
if (!w) w = d;
j += w;
}
}
return ans;
}
};
PYTHON
class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if numRows <= 1:
return s
n = len(s)
ans = []
step = 2 * numRows - 2
for i in range(numRows):
one = i
two = -i
while one < n or two < n:
if 0 <= two < n and one != two and i != numRows - 1:
ans.append(s[two])
if one < n:
ans.append(s[one])
one += step
two += step
return "".join(ans)
JAVASCRIPT
var convert = function (s, numRows) {
if (numRows == 1) return s;
let arr = new Array(numRows);
for (let i = 0; i < numRows; i++) arr[i] = [];
let mi = 0,
isDown = true;
for (const c of s) {
arr[mi].push(c);
if (mi >= numRows - 1) isDown = false;
else if (mi <= 0) isDown = true;
if (isDown) mi++;
else mi--;
}
let ans = [];
for (let item of arr) {
ans = ans.concat(item);
}
return ans.join('');
};