The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P A H N A P L S I I G Y I R And then read line by line: “PAHNAPLSIIGYIR” Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows); convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.

解题思路 所谓的 zigzag就是将一个字符串,按照z字形重新排列,再按行输出。但是可以发现一个规律,在组成 z形后,第一行与最后一行每相邻的两个元素间的间隔是2(n-1) n是规定的将这个字符串分成几行。其他行的规律是,每两个元素间按照2(n-i-1)和2*i的规律间隔变化。

char* convert(char* s, int numRows) {
    char *result;
    int size = strlen(s);
    result =(char*)malloc((size+1)*sizeof(char));
    char*p = result;
    int i=0,j;
    int r = 0;
    //如果要形成的z型行数为1或者数组的总长度少于要分成的行数则可以直接返回数组
    if(numRows <= 1||size<=numRows||s==NULL){
        return s;
    }

    for(i=0;i<numRows;i++){
        j = i;
        r = 0;//一开始由于这里我没有归零,而老是发生rumtime erro的错误。每次循环都要置为0,r代表每行中第几列。
        while(j<size){      
            *(p++) = s[j];
            if(i==0||i==numRows-1){
                j+=2*(numRows-1);
            }
            else if(i>=1||i<numRows-1)
            {
    //交替出现
                if(r%2==0) {
                    j+=2*(numRows-i-1); 
                }
                else {
                    j+=2*i;
                }
                r++;
            }

        }
    }
    *p='\0';
    return result;
}

malloc可以动态的分配数组的大小,但是记得用完以后要将它free掉,不然会内存泄露。

关于c中的指针 好久不写 C对指针这方面生疏许多,就翻书看了看。一个指针p是指一个地址,*p是指针变量p所指向的变量的值。 本程序中使用了指针p来引用数组,事先,p指向数组result的第一个元素,随着++逐渐向后推移。