ZigZag
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
ZigZag是什么呢?上面的例子可以画个图
输入:s=0123456779. num_rows=2
输入:s=0123456779. num_rows=3
输入:s=0123456779. num_rows=4
找规律可知:
- 第一行和最后一行都是相差2*numRows-2
- 除了第一行和最后一行,其他两个中间都有插一个字符,这个字符的下标和他前一个的下标相差2(numRows-i)-2,其中i表示第i行。
C++版本。
#include<iostream>
using namespace std;
string convert(string s, int numRows) {
int interval = numRows*2-2;
string res="";
if(numRows==1) return s;
if(s.length()<1||numRows==0) return "";
for(int i=0;i<numRows;i++){
for(int j=i;j<s.length();j=j+interval){
if(i==0 || i==numRows-1){ //第一行和最后一行
res += s[j];
}
else { //其他行
res += s[j];
int tmp = j+2*numRows-2*i-2;
if(tmp<s.length()) res+=s[tmp];
}
}
}
return res;
}
int main(){
int n;
string s;
cin>>s>>n;
string s1 = convert(s, n);
cout<<s1<<endl;
return 0;
}