题目源自leetcode
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 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型转换的过程。
要点:注意下标变化,考虑边界情况(numRows = 1)
class Solution {
public:
char mat[1000][1000];
string convert(string s, int numRows)
{
int numCols = s.size();
if(numRows == 1)
{
return s;
}
for(int i = 0; i < numRows; i ++)
{
for(int j = 0; j < numCols; j ++)
{
mat[i][j] = ' ';
}
}
int cols = 0, rows = 0;
int count = 0;
//cout<<numRows<<" "<< numCols<<endl;
while(count < s.size())
{
// fill vertical line
while(rows < numRows && count < s.size())
{
mat[rows][cols] = s[count];
count ++;
rows ++;
}
// fill non-vertical line
rows = numRows - 2;
cols ++;
while(rows >= 0 && count < s.size())
{
mat[rows][cols] = s[count];
rows --;
count ++;
cols ++;
if(count > s.size()) break;
}
rows = 1;
cols --;
//printMat(numRows, numCols);
}//while
string str = "";
for(int i = 0; i < numRows; i++)
{
for(int j = 0; j < numCols; j++)
{
if(mat[i][j] != ' ') str += mat[i][j];
}
}
return str;
}
};