这道题看着很简单,只要把原串分到几个行中,在拼接起来就可以了,相当于把字符串分到容器中。
public string Convert(string s, int numRows)
{
if(s.Length == 0 || numRows == 1)//直接返回
{
return s;
}
string[] test = new string[numRows];
int c = numRows * 2 - 2;
int times = s.Length / c;
int remainder = s.Length % c;
for (int k = 0; k < times; k++)//有k个半Z
{
test[0] += s[k * c];//分发
test[numRows - 1] += s[k * c + numRows - 1];
for (int i = 1; i < numRows - 1; i++)
{
test[i] += s[k * c + i];
test[i] += s[k * c + c - i];
}
}
for (int i = 0; i < remainder && i < numRows; i++)//分发剩下的不足半Z的
{
test[i] += s[times * c + i];
if (times * c + c - (i == numRows - 1 ? 0 : i) < s.Length)
{
test[i] += s[times * c + c - i];
}
}
string result = "";
for (int i = 0; i < numRows; i++)//拼接
{
result += test[i];
}
return result;
}
但是实际上还有另一种方法,不是分发字符串,而是用容器来接收字符串,这种方法很巧妙,也很容易理解,不需要计算字符的位置关系。
public string Convert(string s, int numRows)
{
if(s.Length == 0 || numRows == 1)
{
return s;
}
string[] test = new string[numRows];
bool IsStraight = false;//是否为z字形的横边
int r = 0;
for (int i = 0; i < s.Length; i++)
{
test[r] += s[i];
if (r == 0 || r == numRows - 1)//根据是否是横边,来决定接收字符的是哪一个容器
{
IsStraight = !IsStraight;
}
r += IsStraight ? 1 : -1;
}
string result = "";
for (int i = 0; i < numRows; i++)//拼接
{
result += test[i];
}
return result;
}