库你急哇,哈集美马戏特~~
生气是无能的表现,这道题真得让我很生气!!!!
我以前觉得我不笨,我现在觉得我以前觉得错了
本次采用官方题解1,思路是真的好,吊打我的2维数组,感觉看了官方的思路之后,它的代码竟然会动(-_-)
在这里还要感谢一下帮助我解决内存溢出的问题的大佬,ZHYyyds(@-@)
先写一下执行错误吧,有遇到的同学可以想一下为什么result在malloc的时候,长度要写成len+1,这就是问题的关键
AddressSanitizer: heap-buffer-overflow on address 0x60200000025e at pc 0x5652e8e3754b bp 0x7ffd15536510 sp 0x7ffd15536500
和官方给的一个看不懂是什么的报错
题目:
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入:s = “PAYPALISHIRING”, numRows = 3
输出:“PAHNAPLSIIGYIR”
示例 2:
输入:s = “PAYPALISHIRING”, numRows = 4
输出:“PINALSIGYAHRPI”
解释:
P I N
A L S I G
Y A H R
P I
示例 3:
输入:s = “A”, numRows = 1
输出:“A”
提示:
1 <= s.length <= 1000
s 由英文字母(小写和大写)、',' 和 '.' 组成
1 <= numRows <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码(经过线上OJ测试)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
char ch;
struct node *next;
}Node;
char * convert(char * s, int numRows){
if(numRows==1)
{
return s;
}
int len=strlen(s);
if(len==0||numRows<=0)
{
return NULL;
}
int small=(len>numRows)?numRows:len;
Node *x[small];
Node *end[small];
int i=0;
for(i=0;i<small;i++)
{
x[i]=(Node *)malloc(sizeof(Node));
x[i]->ch='\0';
end[i]=x[i];
}
int cutRow=0;
int goingDown=0;
for(i=0;i<len;i++)
{
end[cutRow]->ch=s[i];
end[cutRow]->next=(Node *)malloc(sizeof (Node));
end[cutRow]=end[cutRow]->next;
end[cutRow]->ch='\0';
if(cutRow==0||cutRow==small-1)
{
goingDown=(goingDown+1)%2;
}
cutRow=cutRow+(goingDown?1:-1);
}
char *result=(char *)malloc(sizeof(char)*(len+1));
memset(result,'\0',len+1);
int n=0;
for(i=0;i<small;i++)
{
while(x[i]->ch!='\0')
{
result[n]=x[i]->ch;
n++;
x[i]=x[i]->next;
}
}
return result;
}
int main()
{
char test[]="PAYPALISHIRING";
int numRows = 3;
char *result=convert(test,numRows);
printf("%s",result);
return 0;
}