這道題感覺沒啥技術(shù)含量,只要你找到它的規(guī)律就可以做出來
我先將整個圖形分成一組一組的小圖形,我圈出來的算一組
如果一個Z的numRows是n尼夺,那么一組的size就是 2 * n - 2
我把整個Z字形分成三層
上面為第一層,在添加到新字符串中很容易,第一層的元素在字符串中的索引是
s[j * size], j 是 該元素是屬于第幾組(從0開始)屏箍,size則是一組的大小中間若干層绘梦,可以看成是一對一對的元素, 設(shè)當(dāng)前層高為i,也就是從上往下數(shù)第i行(從0開始),要添加到新字符串中的字符為 s[i + j * size] 和 s[size - i + j * size]赴魁,后面的j * size 表示他是第幾組的
最后一層和第一類類似卸奉,可以很快得出加入新字符串的字符為s[numRows - 1 + j * size]
class Solution
{
public:
string convert(string s, int numRows)
{
// numRows 等于1特殊情況,直接返回原數(shù)組
if (numRows == 1)
return s;
// 每個分組的大小
int size = 2 * numRows - 2;
// 字符串長度
int length = s.size();
// 一共有幾個分組颖御,向上取整
int n = ceil(double(s.size()) / double((2 * numRows - 2)));
string s1;
// 加入第1行
int j = 0;
while (j < n && j * size < length)
{
s1 += s[0 + j * size];
j++;
}
// 加入第 2 - numRows - 1 行
for (int i = 1; i < numRows - 1; i++)
{
int j = 0;
// 因為我們在求組數(shù)時榄棵,是向上取整,所以不能保證最后一組是完整的潘拱,但是可以保證前 n - 1組是完整的
while (j < n - 1)
{
s1 += s[i + j * size];
s1 += s[size - i + j * size];
j++;
}
// 單獨考慮最后一組的索引是否越界
if (j == n - 1)
{
if (i + j * size < length)
s1 += s[i + j * size];
if (size - i + j * size < length)
s1 += s[size - i + j * size];
}
}
// 加入第numRows 行
j = 0;
while (j < n && numRows - 1 + j * size < length)
{
s1 += s[numRows - 1 + j * size];
j++;
}
return s1;
}
};
最后疹鳄,雖然這題沒技術(shù)含量,但是兩次提交就過了好開心芦岂,第一次只是沒有考慮 numRows = 1的特殊情況