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
翻译
将字符串 “PAYPALISHIRING” 以Z字形排列成给定的行数:
P A H N
A P L S I I G
Y I R
之后从左往右,逐行读取字符:“PAHNAPLSIIGYIR”
实现一个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
分析
首位两行间隔固定,中间行间隔线性变化,分类讨论即可。
c++实现
class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1)return s;
int len = s.size(), k = 0, interval = (numRows<<1)-2;
string res(len, ' ');
for(int j = 0; j < len ; j += interval)//处理第一行
res[k++] = s[j];
for(int i = 1; i < numRows-1; i++)//处理中间行
{
int inter = (i<<1);
for(int j = i; j < len; j += inter)
{
res[k++] = s[j];
inter = interval - inter;
}
}
for(int j = numRows-1; j < len ; j += interval)//处理最后一行
res[k++] = s[j];
return res;
}
};