原谅博主渣没有想到公式解,只好用模拟的办法给做出来了。
有两个易错点。
1,hash数组没有初始化。
2,len < numRows的情况
class Solution {
public:
string convert(string s, int numRows) {
string ans;
if (numRows == 1) {
return s;
}
if (numRows == 2) {
int len = s.size();
for (int i = 0; i < len; i+=2) {
ans+=s[i];
}
for (int i = 1; i < len; i+=2) {
ans+=s[i];
}
return ans;
}
int len = s.size();
int hash[len+1][len+1];// todo
memset(hash, 0, sizeof(hash));
int sum = 0;
int x = 0, y = 0;
bool down = true;
while (sum < len) {
if (down == true) {
if (x < numRows) {
hash[x][y] = ++sum;
++x;
} else {
--x;
++y;
down = false;
}
} else {
if (x == numRows-1) {
--x;
}
else if (x == 0) {
++y;
down = true;
} else {
hash[x][y] = ++sum;
--x;
}
}
}
/*
for (int i = 0; i < numRows; ++i) {
for (int j = 0; j <= y; ++j) {
cout << hash[x][y] << " ";
}
cout << endl;
}
*/
int col;
if (len < numRows) {
col = len;
} else {
col = numRows;
}
for (int i = 0; i < col; ++i) {
for (int j = 0; j <= y; ++j) {
if (hash[i][j] != 0) {
ans+=s[hash[i][j]-1];
}
}
}
return ans;
}
};
另附公式解供以后参考:
假设我们分成m排:
1 第i排从i开始
2 第i排两个数的间隔是2(i-1),2(m-i)交替