跟我坚持刷leetcode(第一天-z型字符转换)

对抗惰性,从今天做起。坚持每天刷leetcode并附带一个题的题目,思路,代码。感兴趣的小伙伴一起坚持来吧(c代码,不过思路都是差不多的)。


题目(难度中等):

IMG_20170402_211043.jpg

输入:按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;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,495评论 3 44
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 4,042评论 2 13
  • 距离分时间性和空间性。 距离分物质性和思想性。 距离分阶级性和梦想性。 起笔之前,我也不知道,距离是一个概念的词。...
    流云小斋阅读 147评论 0 0
  • 不是所有的社群,都是一切按照规矩做事,不是所有的社群都可以尽心尽责,不是所有的社群都可以让你每天坚持输出力。 一直...
    严艺丹阅读 226评论 0 1