输入是一个共有nRows行的,按照Z型读取的字符串:即从上往下,再斜上;从上往下,再斜上;从上往下,再斜上……
可以看出,“从上往下,再斜上”即为2*nRows-2的周期。
根据此周期,可以恢复出nRows行字符串,将这些字符串拼接在一起即可。
第二次
这次做的没有比第一次简单:
- 第一次采用vector<string>, 比较简单地算出了nRows行的string, 然后把它们拼接起来
- 第二次(本次),假设我们最终也能算出nRows行字符串,通过第i行的第j个字符,可以计算字符串s中对应的那个字符的下标。
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1)
return s;
string res;
int offset = 2 * numRows - 2;
for (int i = 0; i < numRows; ++ i)
for (int j = 0; ; ++ j) {
int idx;
if (i == 0 || i == numRows - 1)
idx = j * offset + i;
else
idx = (j + 1) / 2 * offset + (j % 2 == 0? i: -i);
if (idx < s.size())
res += s[idx];
else
break;
}
return res;
}
};
class Solution(object):
def convert(self, s, numRows):
if numRows == 1:
return s
res = str()
offset = 2 * numRows - 2
for i in range(0, numRows):
j = 0
while True:
if i == 0 or i == numRows - 1:
idx = j * offset + i
else:
idx = int((j + 1) / 2) * offset + (i if j % 2 == 0 else -i)
if idx < len(s):
res += s[idx]
else:
break;
j = j + 1
return res
第一次
class Solution
{
public:
string convert(string s, int nRows)
{
if (nRows == 1)
{
return s;
}
string ret;
vector<string> rows(nRows);
int interval = 2*nRows-2;
for (size_t i = 0; i < s.size(); ++ i)
{
if (i % interval < nRows)
{
rows[i%interval] += s[i];
} else
{
rows[nRows-1-(i%interval-nRows+1)] += s[i];
}
}
for (size_t i = 0; i < nRows; ++ i)
{
ret += rows[i];
}
return ret;
}
};