答案 0 :(得分:2)
仔细看看你的输出:
a.....g.....m.....s.
.b...f.h...l.n...r.t
..c.e...i.k...o.q...
...d.....j.....p....
请注意,它可以拆分为类似的重复块:
a..... g..... m..... s.
.b...f .h...l .n...r .t
..c.e. ..i.k. ..o.q. ..
...d.. ...j.. ...p.. ..
这个块的长度是可以计算的:每一行,除了第一行和最后一行,都有2个字母。总长度为:rows * 2 - 2
。我们称之为blockLength
。顺便说一句,x * 2 - 2
总是平均的 - 这很重要。
现在,您可以看到,在每个区块中,字母在左半部分“下沉”,并在第二个中出现。所以,如果你进行一些观察和分析,你就会明白,对于blockLength == 6
你需要在i输出字母:
row | i % blockLength
----------------------------
0 | 0
1 | 1, blockLength - 1
2 | 2, blockLength - 2
3 | 3
i
超过blockLength
后,它会一次又一次地重复,直到字符串结束。如果您了解它的基础知识,这种规律性可以很容易地转换为JavaScript循环。
在循环中设置Zig-zag顺序的值:
var str = 'abcdefghijklmopqrst';
var rows = 4, letterRows = [], currentRow = 0, direction = 1;
for (var i = 0; i < str.length; i++)
{
letterRows.push(currentRow);
currentRow += direction;
if ((direction === 1 && currentRow == rows - 1) // bottom limit
|| (direction === -1 && currentRow == 0)) // top limit
{
direction = direction * -1; // invert direction
}
}
然后,在嵌套循环中,只需根据letterRows
输出您的字母:
for (var row = 0; row < rows; row++)
{
for (var i = 0; i < str.length; i++)
{
output(letterRows[i] == row ? str[i] : '.'); // output is any possible output in your case
}
output('\n');
}