题目描述: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”.
Therefore, s = ABCD, row = 2, can be arranged as:
A….C
…B….D
由于原题对于题目描述不太清楚,我照着disscuss里面加了一个例子描述,方便阅读。
首先是我自己的代码:
/****************************************/
string s = “ABC”;
int numRows = 2 ;
if (s.size() == 1)
{
cout << s.size();
return 0;
}
string str;
int num2 = numRows / 2;
char ch[1000][1000];
int row = 0;
int i = 0;
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 200; j++)
{
ch[i][j] = ’ ‘;
}
}
while (i < s.size())
{
for (int j = 0; j < numRows; j++, row++) {
ch[j][row] = s[i];
i++;
}
}
i = 0;
while (i<s.size())
{
for (int k = 0; k<numRows; k++) {
int j = 0;
int temp = 0;
while(temp < 2) {
if (ch[k][j] == ' ' || ch[k][j] == '\0')
{
j++;
temp++;
continue;
}
else
{
temp = 0;
str += ch[k][j];
i++;
j++;
}
}
}
}
return str;
/*****************************************/
写的很烂,思路很简单,就是用一个二维数组模拟一遍题目的转换过程,先竖着存入,然后横着读出,但是应该是由于我的二维数组范围的问题,导致不通过。然后我看了下disscuss里面大神的算法。
/******************************************************/
string s = "ABC";
int nRows = 2 ;
for (int i = 0; i < len; ++i)
{
str[row].push_back(s[i]);
if (row == 0)
step = 1;
else if (row == nRows - 1)
step = -1;
row += step;
}
s.clear();
for (int j = 0; j < nRows; ++j)
{
s.append(str[j]);
}
/*****************************************************/
代码简洁,思路简单,同样是模拟一个转换的过程,先从第一行开始存,然后行数++,存到最后一行的时候又开始返回往上开始存,行数--,知道s的字符串存完,整个存储过程类似于一个“W”的形状。
菜鸡继续加油。。。