题目大意:将给定的字符串在给定的行数内不断地画Z字,然后横向读出字符
题目分析:本题只要将画Z字的过程模拟出来,按照列的顺序来填字符就可以了。
我是将画布用一个numRows*len的二维矩阵来初始化,初始化所有格子为'\0',然后按列来填字符。
列有两种情况:一种是每列有numRows个字符,这种情况只要按顺序填numRows个字符即可;
另一种情况是每列只有一个字符,这种情况需要计算它的行号,发现它和当前列号与numRows的模是有关系的。
行号 = numRows - (列号%(numRows-1)) - 1
另外,如果将numRows=1单独处理,可以避免之后出现的除数为0的情况
代码展示:
class Solution {
public:
string convert(string s, int numRows) {
int len = s.length();
int numColms = 0;
if(numRows!=1)
numColms = len;
else
return s;
char num[numRows][numColms];
memset(num,'\0',sizeof(num));
int k = 0;
for(int i=0;i<numColms;i++){ //分析第i列
int temp = i%(numRows-1);
if(temp==0){ //表示该列有不止一个数字
for(int j=0;j<numRows;j++){
if(k>=len)
break;
num[j][i] = s[k++];
}
}
else{ //否则该列只有一个数字
if(k>=len)
break;
num[numRows-temp-1][i] = s[k++];
}
}
string str = "";
for(int i=0;i<numRows;i++){
for(int j=0;j<numColms;j++){
if(num[i][j]!='\0')
str += num[i][j];
}
}
return str;
}
};