对抗惰性,从今天做起。坚持每天刷leetcode并附带一个题的题目,思路,代码。感兴趣的小伙伴一起坚持来吧(c代码,不过思路都是差不多的)。
题目(难度中等):
输入:按z型输入的字符串和行数。
输出:按每一行的顺序读出来的字符串。
函数定义为:
char* change(char* s,int row);
思路:
先考虑特殊情况,行数为1或者字符串长度小于等于行数,直接返回原字符串。
1.建立一个二维数组,按照给出的字符串顺序一个一个存进去。但是非常麻烦,不仅要把字符串传入到二维数组中,还要在输出时再处理成一个字符串(python的话可以解决这个问题,不过c不好办)。
2.那么只能创建一个新的字符串了。需要注意的是z型字符可以是不完整的,像上面的图片,一个完整的z多了一个"尾巴x"。先观察一下规律,以上面的图片为例子。A和S之间的偏移量是2倍的(行数减1),那么我们可以创建行变量i作为大的循环。循环内部里面,第一行和最后一行是好处理的,中间行的偏移量需要根据行数变化而变化。但是要时刻注意不要数组越界。
代码
char* change(char* s,int row)
{
int len = strlen(s);
if(row==1||len<=row)
return s;
char* a = malloc(sizeof(char)*len);
int i=0,j=0,k=0;
for(i=0;i<row;i++)
{
j = i;
if(i==0||i==(row-1))
{
while(j<len)
{
a[k++] = s[j];
j = j+2*(row-1);
}
}
else
{
while(j<len)
{
a[k++] = s[j];
j = j+2*(row-1-i);
if(j<len)
{
a[k++] = s[j];
j = j+2*i;
}
}
}
}
return a;
}