如何获取矩形结构数组指定索引的对角元素及修复代码问题
解决矩形数组对角线元素获取问题
你的代码目前有两个核心问题:
- 两条对角线逻辑完全重复:你对
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
相关产品推荐
相关产品推荐

