将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P I N
A L S I G
Y A H R
P I
示例 3:
输入:s = "A", numRows = 1
输出:"A"
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
理解之后很容易利用数学推导出答案,关键是对循环体的选择和边界条件的判断着实需要花费时间。
char * convert(char * s, int numRows){
int circle=2*(numRows-1);
if(strlen(s)==1){
return s;
}
if(numRows==1){
return s;
}
int count=strlen(s)/circle+1;
int icount=0;
char *a=(char *)malloc(sizeof(char)*(strlen(s)+1));
a[strlen(s)]='\0';
for(int i=1;i<=circle;i++){
for(int j=1;j<=count;j++){
if(icount+1<=strlen(s)){
if(i==1){
if((((j-1)*circle)+1)<=strlen(s)){
a[icount]=s[(j-1)*circle];
icount++;}
}
if(i>=2&&i<numRows){
if(((j-1)*circle+i-1)+1<=strlen(s)){
a[icount]=s[(j-1)*circle+i-1];
icount++;}
if(((2*j-1)*circle-((j-1)*circle+i-1)+1)<=strlen(s)){
a[icount]=s[(2*j-1)*circle-((j-1)*circle+i-1)];
icount++;
}
}
if(i==numRows){
if(((((j-1)*circle)+numRows-1)+1)<=strlen(s)){
a[icount]=s[((j-1)*circle)+numRows-1];
icount++;}
}
}
}
}
return a;
}
思路很简单,但是看别人的思路更加简洁,二刷的时候再优化吧。