问题描述
给定一个字符串,把字符串按连续的”N”字型排,然后按行重新写出字符串。例如:”PAYPALISHIRING”分成3行,最终得到”PAHNAPLSIIGYIR”。
代码
#include<iostream>
using namespace std;
char* convert(char* s, int numRows);
int main()
{
char s[100];
int numRows;
char *out;
cin>>s>>numRows;
out = convert(s,numRows);
cout<<out;
}
char* convert(char* s, int numRows)
{
int slen = strlen(s);
char *result = (char *)malloc(sizeof(char)*(slen+1));
int *row = (int *)malloc(sizeof(int)*slen);
int temp = -1;
int flag = 0;
int n = -1;
if(slen < 3 || numRows == 1 || slen == numRows)
return s;
for(int i = 0; i < slen; i++)
{
if(flag != 1 )
{
temp++;
}
else
temp--;
if(temp > numRows-1)
{
temp = numRows-2;
flag = 1;
}
if(temp < 0)
{
temp = 1;
flag = 0;
}
row[i] = temp;
}
for(int k = 0; k < numRows; k++)
{
for(int j = 0; j < slen; j++)
{
if(row[j] == k)
{
n++;
result[n] = s[j];
}
}
}
result[slen] = '\0';
free(row);
return result;
}
总结
1.在把字符串拆成字符处理时,一定要多分配一个空间,并手动在末尾加“\0”。
2.采用flag和count++的方法,可能后面要考虑安全等问题。
3.这个题目,先遍历一遍字符串,并决定了每个字符应该在的行号。再次扫描时,按照行号读入组成新的字符串。