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
对于这个题目,我做法比较复杂。建立了一个二维数组,将输入的字符串首先以Z字形存储起来,最后再拼接为字符串输出。
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
string s;
int numRows;
cin>>s>>numRows;
int len = s.length();
//加1,考虑输入s为空的情况
char str[numRows][len+1];
int strFlag[numRows][len+1];
memset(strFlag,0,sizeof(strFlag));
//行
int row=0;
//列
int col = 0;
//flag为true表示row++,false表示row--
bool flag = true;
//flag1为true表示col不加,false表示自加
bool flag1 = true;
//j通过自加,控制flag1的变化
int j=0;
for(int i=0;i<s.length();i++){
str[row][col] = s[i];
strFlag[row][col] = 1;
//输入1行情况下,row为0,col一直自加
if(numRows==1){
row = 0;
col++;
}else{
if(row==0){
row++;
flag = true;
}else if(row==numRows-1){
row--;
flag = false;
}else if(flag){
row++;
}else{
row--;
}
j++;
if(j>numRows-1){
j=1;
if(flag1){flag1 = false;
}else{flag1 = true;}
}
if(!flag1){col++;}
}
}
string sstr;
for(int t=0;t<numRows;t++){
for(int h=0;h<=col;h++){
if(strFlag[t][h]==1){
cout<<str[t][h]<<" ";
sstr = sstr+str[t][h];
}else{
cout<<" "<<" ";
}
}
cout<<endl;
}
cout <<endl<< sstr << endl;
return 0;
}