繁体   English   中英

用JavaScript打印二维数组

[英]Printing 2d array in javascript

轨

就像上面的图片一样,在使用Javascript的情况下,如果给defendtheeastwallofthecastle这个词,那么如何创建四个单独的文本行呢?

数学解

仔细看看您的输出:

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循环。

懒惰的解决方案

在循环中,以Z字形顺序设置值:

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');
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM