想去github下载也行,连接放这儿了;
GitHub - frankRenlf/c_dailyWorkhttps://github.com/frankRenlf/c_dailyWork.git
将一个给定字符串 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);
char* convert_success(char* s, int numRows) {
if (numRows == 1) return s;
int step = numRows * 2 - 2; // 间距
int index = 0;// 记录s的下标
int len = strlen(s);
int add = 0; // 真实的间距
char static ret[1000] = { 0 };
int k = 0;
for (int i = 0; i < numRows; i++) // i表示行号
{
index = i;
add = i * 2;
while (index < len)//超出字符串长度计算下一层
{
ret[k] = s[index]; // 当前行的第一个字母
k++;
add = step - add;// 第一次间距是step -2*i,第二次是2*i,
index += (i == 0 || i == numRows - 1) ? step : add; // 0行和最后一行使用step间距,其余使用add间距
}
}
ret[k] = '\0';
return ret;
}
char* convert_false(char* s, int numRows) {
if (numRows == 1) return s;
int step = numRows * 2 - 2; // 间距
int index = 0;// 记录s的下标
int len = strlen(s);
int add = 0; // 真实的间距
char* ret = (char*)malloc(sizeof(char) * len);
int k = 0;
for (int i = 0; i < numRows; i++) // i表示行号
{
index = i;
add = i * 2;
while (index < len)//超出字符串长度计算下一层
{
ret[k] = s[index]; // 当前行的第一个字母
k++;
add = step - add;// 第一次间距是step -2*i,第二次是2*i,
index += (i == 0 || i == numRows - 1) ? step : add; // 0行和最后一行使用step间距,其余使用add间距
}
}
ret[k] = '\0';
return ret;
}
int main()
{
//test1();
//test2();
//test3();
//test4();
//char arr[] = "abcabcdabc";
//printf("%d\n", lengthOfLongestSubstring(arr));
char s[] = "Apalindromeisaword,phrase,number,orothersequenceofunitsthatcanbereadthesamewayineitherdirection,withgeneralallowancesforadjustmentstopunctuationandworddividers.";
int numRows = 2;
printf("%s\n", convert_success(s, numRows));
printf("%s\n", convert_false(s, numRows));
return 0;
}
第一种success的方法我把变量转为static后就能通过,只要每次运行把后一位设成'\0'就不会读取其他数据了.
但是后一种我觉得用malloc也可以,并且我自己的编译器上这两种方法都能跑,但是用malloc的方法在leetcode上失败了,返回(null)也不知道为啥.
后面是vs上连个都运行成功的截图
有问题可在评论指出,觉得还行就给个赞和关注吧
也可以关注这个系列,后续也会有更新,和其他代码产出