题目描述:
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”.
解题思路:
这道题主要是对之字形的数字进行规律的查找,本文的解题规律如下(假设字符串被排列成n行):
①对于第一行和最后一行,各个字符之间间隔zigSpan=2(n-1)。
②对于中间的其它行,字符串之间的间隔是zigSpan-2*i(i表示行,从0开始),那么该输出的字符位置就是j+zigSpan-2i,(j是斜着排列那些字符的前一个字符在字符串s中的位置)。
代码展示:
#include<iostream>
#include<string>
using namespace std;
string convert(string s, int nRows)
{
if(nRows <= 1 || s.length() < 3 || s.length() <= nRows) return s;
string s2;
int zigSpan = nRows*2 - 2;
for (int i = 0; i < nRows; i++)
{
for (int j = i; j < s.length(); j+=zigSpan)
{
s2.push_back(s[j]);
if (i != 0 && i != nRows-1 && zigSpan+j-2*i<s.length())
{
s2.push_back(s[zigSpan+j-2*i]);
}
}
}
return s2;
}