思路
将Z看成多个“一竖”以及“斜线”组成,根据已知的行数可得这Z字形一竖和斜线包含的字符个数为(2numRows-2)。将整个字符串划分为长度为(2numRows-2)的若干组,变量z_sum表示划分的组数。设置二维数组,保存划分后的字符串,字符串未填满的地方用0初始化。
按行读二维数组对应的字符串,除了第一行和最后一行,同一行上竖线和斜线的两个字符串满足下标相加等于2*numRows-2。
源代码
class Solution {
public:
string convert(string s, int numRows) {
int length=s.length();
int z_sum;
int i=0,j=0,x=0,y=0;
string res=""; //结果字符串
if (numRows==1) return s; //只有一行
if(length%numRows==0)
z_sum=length/numRows; //可划分的组数
else
z_sum=length/numRows+1;
char array[2*numRows-2][z_sum];
memset(array,'0',sizeof(array)); //数组初始化为0
for(i=0;i<length;i++)
{
x=i/(2*numRows-2);
y=i%(2*numRows-2);
array[y][x]=s[i];
}
//合并结果
for(i=0;i<numRows;i++)
{
for(j=0;j<z_sum;j++)
{
if(array[i][j]=='0')
continue;
else
{
res=res+array[i][j];
if(i!=0&&i!=numRows-1)
{
if(array[2*numRows-2-i][j]=='0')
continue;
else
res=res+array[2*numRows-2-i][j];
}
}
}
}
return res;
}
};
总结
提交代码后发现程序占用的内存比较大,运行时间也较慢,后参考了一些优秀的代码后发现二维数组可以不用,直接在原字符串上操作。