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的第一个元素,随着++逐渐向后推移。