字形变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L D R
E O E I I
E C I H N
T S G
这个题一开始一看就用二维数组,但其实发现直接找规律就可以
先贴一个笨办法
char * convert(char * s, int numRows){
if(numRows==1||numRows==0){
return s;
}
int len = strlen(s);
int num = len;
int i,j,k;
char **obj;
//存储最终结果
char *result= (char*)malloc(sizeof(char)*(len+1));
//obj模拟二维数组
obj = (char **)malloc(sizeof(char *) *numRows);
for(int i=0;i<numRows;i++){
obj[i]=(char *)malloc(sizeof(char) *len);
memset(obj[i],0,sizeof(char) *len);
}
i=0;j=0;k=0;
while(num--){
//进行n的下
while(k<len&&i<numRows-1){
obj[i][j]=s[k];
i++;
k++;
}
while(k<len&&i>0){
obj[i][j]=s[k];
i--;
j++;
k++;
}
}
k=0;
for(i=0;i<numRows;i++){
for(j=0;j<len;j++){
if(obj[i][j]!=0){
result[k]=obj[i][j];
k++;
if(k==len){
result[len]='\0';
return result;
}
}
}
}
result[len]='\0';
return result;
}
来一个方便的
char *convert(char *s, int numRows)
{
int len = strlen(s);
if (numRows <= 1)
return s;
char *t = (char *)malloc(sizeof(char) * (len + 1));
int numSize = 0;
int n = 2 * numRows - 2;
for (int i = 0; i < numRows; i++)
{
for (int j = 0; j < len; j++)
{
int k = j % n;
if (k == i || k == n - i)
{
t[numSize++] = s[j];
}
}
}
t[numSize] = '\0';
return t;
}
总结
1.要注重规律的总结,而不是老想着去模拟
2.在leetcode申请一个数组存放原数组时,数组大小要扩大一点,不然会判断溢出可能
3.要注意二维数组malloc申请空间,以及memset二维数组方式https://blog.csdn.net/m0_37687058/article/details/105919995
4.对于图形类的字符可以用数字先进行查看,一般可能存在某种规律