看到这个题目的时候只怪笔者太笨,编程经验太少。想了半天,开始打算用二维数组来存储,然后再输出,可是尝试了半天,没找出办法。后来看了一下网上的做法(我怎么总是要借鉴别人的!!!)说是可以找出编号的规律,然后按规律存到新建数组里就可以了。在找规律的过程中,之前也找了好半天,脑袋一团浆糊(估计是因为我在一边看康熙来了一遍算T.T),于是今天上午我就认真找了一下规律,发现并不难。
如图列出row=4的Z形,字符串编号排列规律(i表示行,j表示列):第1行和第row-1行只有在j是(row-1)的整数倍时才有字符。而第2行到第row-2行不仅有j是(row-1)的整数倍时有字符,并且在j除以(row-1)余数为row-1-i时有字符。第i行第j列字符的编号是(i+j*2)。
class Solution {
public:
string convert(string s, int numRows) {
string c="";
int len = s.length();
if(numRows==0||numRows==1) c=s; //在numRows只有一行或者为0的时候
else{
int i = 0;
int j = 0;
while (i + j * 2 < len) //第0行
{
if (j % (numRows - 1) == 0)
c += s[i + j * 2];
j++;
}
j = 0;
for (i = 1; i < numRows; i++, m--) //第1行到第numRows-1行
{
while (i + j * 2 < len)
{
//在第numRows-1行时,这两种情况是一样的,所以可以把最后一行放在
//这里面讨论
if (j%(numRows-1)==numRows-1-i || j % (numRows - 1) == 0) c += s[i + j * 2];
j++;
}
j=0;
}
}
return c;
}
};
然而这种做法的时间复杂度不够好。AC,Runtime: 68 ms
class Solution {
public:
string convert(string s, int numRows) {
if(numRows==0||numRows==1) return s;
string c;
int j=0,i=0;
int row=numRows-1;
//每一行情况不用分类,可以一起处理
for( ;i<numRows;i++){
while((i+j*2)<s.length()){
if((j%row==row-i)||j%row==0)
c+=s[i+j*2];
j++;
}
j=0;
}
return c;
}
};