程序员坚持LeetCode

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

2017-04-02  本文已影响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;
}

上一篇 下一篇

猜你喜欢

热点阅读