javascript - 如何动态填充三 Angular 形二维数组?

标签 javascript arrays

我的任务需要基于三 Angular 矩阵进行数值计算(模数不超过9,数组的大小不能超过15):

 1 2 3 4 5
  7 8 9 0
   4 5 6
    2 3
     1

我认为将数据存储在二维三 Angular 形数组中是最方便的。

UPD:随后,我需要选择从第二层的任何元素到最顶层的最大路径(该路径只能沿对 Angular 线走,不能垂直或水平向上)。这是一个类似于最大路径问题的任务,其解决方案看起来最简单,使用 2D array .

这里我同时遇到了几个问题:

1) 如何静态创建三 Angular 形数组?

现在我正在做这样的事情:

let numbers = [1, 2, 3, 4, 5, 6];

function fillArray(nums, layer) {
    let arr = [];
    for(let k = 0; k < nums.length;) {
        for (let i = 0; i < layer; i++) {
            arr[i] = [];
            for (let j = 0; j <= i; j++) {
                arr[i][j] = nums[k];
                k++;
            }
        }
    }
    return arr;
}

console.log(fillArray(numbers,3));

也许这是正确的,但它看起来太麻烦了,此外,在我看来,我可以动态计算图层。也许递归解决方案在这里看起来会更好。

2) 如何确定何时创建新的嵌套数组?

静态地讲,一切都非常清楚,但如果我有一个数组,假设它是这样填充的: [ [1], [1, 2], [1, 2] ] 然后如何判断创建新的嵌套数组的时刻,即将当前的数组填充到这个状态:[ [1], [1, 2], [1, 2, 3] ] 和,例如,如果有新元素进入输入,则在填充前一个元素后创建以下内容: [ [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] ]

最佳答案

如果您的计算随机使用三 Angular 矩阵,您可以显式计算行/列索引:

function row_col_from_index(i) {
    let row = 0.5 * ((8*i + 1)**0.5 - 1),
        col = i - row*(row+1)/2;
    return [row, col];
}

function index_from_row_col(row, col) {
    return row*(row+1)/2 + col;
}

然后您可以在需要时在矩阵中惰性地创建所需的行

let matrix = [];
...
let [row, col] = row_col_from_index(i);
(matrix[row]||(matrix[row]=[]))[col] = data;

索引中的行/列的“神奇”公式是通过求解计算出来的

x*(x+1)/2 = n

solution procedure for solving x*(x+1)/2=n

关于javascript - 如何动态填充三 Angular 形二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57335694/

相关文章:

javascript - 一个圆圈上的 CSS 动画圆圈颜色

javascript - 如何通过单击选项而不是实际按钮本身来选择单选按钮

ruby - 返回子数组而不检查 nil

Javascript:总和或所有数字在for循环中不起作用

python - 在另一个数组中查找一个数组的匹配索引

c++ - 初始化后可以调整 C++ 数组的大小吗?

java - 如何检查多个二维数组的所有值是否都相同?

javascript - CSS 不是选择器不工作

javascript - 折叠 div 时 float 背景

javascript - 使用jquery从表中单击复选框获取html值