006ZigZag Conversion (C)


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".

做此题我的想法很简单,并没有去列出其中的规律,既然是之字型,那就用一个二维数组实现吧,就写了下面的程序,最后runtime竟然达到492ms

给了这么一句:you are here! your runtime beats 0.00% of c submissions(无语了,难道没有像我一样这样想的吗?)

char* convert(char* s, int numRows) {
    char zig[numRows][strlen(s)];
    int k,i,j,q;
    if(s[0]=='\0'||numRows==1){
    	return s;
    }
    for(i=0;i<numRows;i++){
    	for(j=0;j<strlen(s);j++){
    		zig[i][j]='\0';
    	}
    }
    i=j=k=q=0;
    while(s[k]!='\0'){
    	if(i<numRows){
    		zig[i++][j]=s[k++];
    	}else{
    		i--;
    		while(s[k]!=0&&i>0){
    			zig[--i][++j]=s[k++];
    		}
    		i++;
    	}
    }
    for(i=0;i<numRows;i++){
    	for(k=0;k<=j;k++){
    		if(zig[i][k]!='\0'){
    			s[q++]=zig[i][k];              
			}
    	}
    }
    return s;
}

在网上搜了一下,发现确实应该找规律,借用一张图,便于理解

0       8       16      
1     7 9     15 17      
2   6   10   14   18      
3 5     11 13     19      
4       12       20      

nRows=5

需要按行输出每一个字符先看1,5,9,...列   (0,1,2,3,4),(8,9,10,11,12),(16,17,18,19,20) 

可以发现对应的行的变化相同为8,这样这些字符就确定了

但是除了首行和末行,中间的还有字符

第二行中间字符距前一个字符间隔为6....

第三行是4...

.....

附上此方法的程序(转载)

http://blog.csdn.net/ljiabin/article/details/40477429



你可能感兴趣的:(006ZigZag Conversion (C))