算法描述:
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"
.
题目来自此处
解决方案:
我的解决思路是(贼麻烦):二维char
数组,以'Z'
型的方式存储字符(一开始字符数组以'0'
填充),然后最后通过检测不是'0'
的字符存储进要输出字符串中。
string convert(string s, int numRows) {
if (numRows == 1) return s;
if (s == "") return "";
char **ch = new char*[numRows];
int i, j, k = 0;
for (i = 0; i<numRows; i++){
ch[i] = new char[s.length() + 1];
}
for (i = 0; i<numRows; i++){
for (j = 0; j <= s.length(); j++){
ch[i][j] = '0';
}
}
int count = s.length();
i = 0;
j = 0;
while (k<count){
if (i == 0){
if (j != 0) i++;
while (i<numRows && k<count){
ch[i][j] = s[k];
i++; k++;
}
}
else if (i >= numRows){
ch[numRows - 2][j + 1] = s[k];
i = numRows - 2;
j++;
k++;
}
else{
i--;
j++;
ch[i][j] = s[k];
k++;
}
}
string rs = "";
for (i = 0; i<numRows; i++){
for (j = 0; j <= s.length(); j++){
if(ch[i][j]!='0'){
rs += ch[i][j];
}
}
}
return rs;
}
这么麻烦的写法时间和空间复杂度都是
O(n2)
……学习答案思路去。。