6. ZigZag Conversion
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”’.
Analysis:
关键是找出规律,参考:http://www.cnblogs.com/TenosDoIt/p/3738693.html
Source Code(C++):
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
using namespace std;
class Solution {
public:
string convert(string s, int numRows) {
if (numRows<1){
return "error";
}
if (numRows==1) {
return s;
}
int interval=numRows*2-2;
string zigzag;
for (int i=0; i<s.size(); i+=interval) {
zigzag.push_back(s.at(i));
}
for (int i=1; i<numRows-1; i++) {
int m_interval=i*2;
for(int j=i; j<s.size(); j +=m_interval) {
zigzag.push_back(s.at(j));
m_interval = interval-m_interval;
}
}
for (int i=numRows-1; i<s.size(); i+=interval) {
zigzag.push_back(s.at(i));
}
return zigzag;
}
};
int main() {
Solution sol;
cout << sol.convert("", 2);
cout << sol.convert("affff", 0);
cout << sol.convert("PAYPALISHIRING", 3);
return 0;
}