You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取矩形结构数组指定索引的对角元素及修复代码问题

解决矩形数组对角线元素获取问题

你的代码目前有两个核心问题:

  • 两条对角线逻辑完全重复:你对arr1和arr2执行了完全相同的循环操作,自然会得到一模一样的结果;
  • 对角线索引计算错误:你用ind + (i * w) + i和ind - (i * w) - i来计算对角线索引,但这只对应了其中一条对角线的步长(w+1),而且没有考虑边界越界的问题,也没控制元素顺序。

下面是修正后的代码,完全符合你的要求——不使用sort(),不遍历全部数组元素,精准获取两条对角线的元素并保持正确顺序:

let arr = Array(20).fill().map((x,i) => i);

function getDias(arr, l, w, ind) {
  // 计算当前索引对应的行和列(从0开始计数)
  const row = Math.floor(ind / w);
  const col = ind % w;

  // 第一条对角线:行 - 列 = 固定值(左上→右下方向,步长为w+1)
  const diag1 = [];
  // 找到这条对角线的起始位置(最左上的元素)
  let start1 = ind - Math.min(row, col) * (w + 1);
  while (start1 < arr.length) {
    const currRow = Math.floor(start1 / w);
    const currCol = start1 % w;
    // 验证是否在目标对角线上(防止越界后进入其他对角线)
    if (currRow - currCol !== row - col) break;
    diag1.push(arr[start1]);
    start1 += (w + 1);
  }

  // 第二条对角线:行 + 列 = 固定值(右上→左下方向,步长为w-1)
  const diag2 = [];
  // 找到这条对角线的起始位置(最右上的元素)
  let start2 = ind - Math.min(row, w - 1 - col) * (w - 1);
  while (start2 < arr.length) {
    const currRow = Math.floor(start2 / w);
    const currCol = start2 % w;
    // 验证是否在目标对角线上
    if (currRow + currCol !== row + col) break;
    diag2.push(arr[start2]);
    start2 += (w - 1);
  }

  return [diag1, diag2];
}

// 测试示例
console.log(getDias(arr, 4, 5, 7)); // 输出 [[1,7,13,19], [3,7,11,15]]
console.log(getDias(arr, 4, 5, 16)); // 输出 [[4,8,12,16], [10,16]]
console.log(getDias(arr, 4, 5, 0)); // 输出 [[0,6,12,18], [0]]

代码说明:

  • 行和列的计算:通过Math.floor(ind/w)得到行号,ind%w得到列号,这是一维数组转二维坐标的核心逻辑;
  • 第一条对角线:所有元素满足行-列的差值与当前元素相同,步长为w+1(下一行下一列,索引增加w+1),从最左上的元素开始遍历到最右下;
  • 第二条对角线:所有元素满足行+列的和与当前元素相同,步长为w-1(下一行上一列,索引增加w-1),从最右上的元素开始遍历到最左下;
  • 边界控制:通过Math.min(row, col)和Math.min(row, w-1-col)找到对角线的起始点,避免越界,同时在循环中加入验证逻辑,确保不会误入其他对角线。

这样的实现完全符合你的需求,既高效又能保证元素顺序正确。

内容的提问来源于stack exchange,提问作者Maheer Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:56:23