美文网首页程序员坚持LeetCode
跟我坚持刷leetcode(第一天-z型字符转换)

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

作者: 北极星光熊 | 来源:发表于2017-04-02 21:37 被阅读103次

    对抗惰性,从今天做起。坚持每天刷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;
    }
    
    

    相关文章

      网友评论

        本文标题:跟我坚持刷leetcode(第一天-z型字符转换)

        本文链接:https://www.haomeiwen.com/subject/skzgottx.html