class Solution {
public:
string convert(string s, int nRows) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
//打印之字形字符串的按行排列
if (nRows == 1)
{
return s;
}
string resStr(s.size(), '\0');
string::size_type len = s.size();
string::size_type cnt = (nRows - 1) << 1;
int loopCnt = ceil(len / (double)cnt);
int half = cnt / 2;
int index = 0;
//第一行单独处理
for (int i = 0; i < loopCnt; ++i)
{
resStr[index++] = s[i * cnt];
}
//第二行到倒数第二行
for (int i = 1; i <= nRows - 2; ++i)
{
for (int j = 0; j < loopCnt; ++j)
{
int sta = j * cnt;
int index1 = sta + i;
if (index1 < len)
{
resStr[index++] = s[index1];
index1 = sta + cnt - i;
if (index1 < len)
{
resStr[index++] = s[index1];
}
}
}
}
//最后一行
for (int i = 0; i < loopCnt; ++i)
{
int index1 = i * cnt + half;
if (index1 < len)
{
resStr[index++] = s[index1];
}
}
return resStr;
}
};
上面的写法不易看懂,因为是以计算好的循环圈数loopCnt为循环终止条件的,不如直接以字符串长度为终止条件来得直观,所以重写如下:
class Solution {
public:
string convert(string s, int nRows) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
string str;
if (nRows <= 1)
return s;
int step = (nRows - 1) << 1;
int len = s.size();
for (int i = 0; i < nRows; ++i)
{
if (i == 0 || i == nRows - 1)
{
for (int j = i; j < len; j += step)
{
str += s[j];
}
}
else
{
int j = i;
for (int j = i; j < len; j += step)
{
str += s[j];
int j1 = j + step - (i << 1);
if (j1 < len)
{
str += s[j1];
}
}
}
}
return str;
}
};