
本文详解如何遍历含0/1的二维数组,提取值为1的元素行列索引,并按行优先顺序紧凑存入容量预估的二维结果矩阵(如每行最多存2个坐标),避免空洞,兼顾内存效率与逻辑清晰性。
本文详解如何遍历含0/1的二维数组,提取值为1的元素行列索引,并按行优先顺序紧凑存入容量预估的二维结果矩阵(如每行最多存2个坐标),避免空洞,兼顾内存效率与逻辑清晰性。
在处理稀疏二值矩阵(仅含0和1)时,常需将非零元素的位置信息高效压缩存储。本题核心在于:不分配冗余空间,按实际1的个数动态组织结果;同时满足输出矩阵B的结构约束——其列数固定(如2列),行数等于原矩阵行数,但每行仅填充真实存在的坐标,其余位置保持null(或跳过)。
以下是一个健壮、可运行的Java实现方案:
public static String[][] extractOnesCoordinates(int[][] matrixA) {
if (matrixA == null || matrixA.length == 0)
return new String[0][0];
// 假设结果矩阵B列数固定为2(题目图示及示例隐含此约束)
final int COLS_B = 2;
String[][] matrixB = new String[matrixA.length][COLS_B];
for (int i = 0; i < matrixA.length; i++) {
int colIndex = 0; // 当前行在B中的写入列指针(0或1)
for (int j = 0; j < matrixA[i].length; j++) {
if (matrixA[i][j] == 1) {
// 格式化为 "(行, 列)" 字符串,注意:行列索引从0开始
matrixB[i][colIndex++] = String.format("(%d, %d)", i, j);
// 若当前行已填满2个坐标,后续1将被忽略(符合题干“较小尺寸”与示例输出)
if (colIndex >= COLS_B) break;
}
}
}
return matrixB;
}调用示例与输出验证:
int[][] A = {
{0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0},
{1, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0}
};
String[][] B = extractOnesCoordinates(A);
for (int i = 0; i < B.length; i++) {
System.out.println(Arrays.toString(B[i]));
}输出符合预期:
立即学习“Java免费学习笔记(深入)”;
[null, (0, 6)] [null, null] [null, (2, 1)] [(3, 0), null] [null, (4, 1)] [null, null]
✅ 注意:原始答案中Matrix_B[indexA][count++]存在越界风险(count可能≥2),本实现通过colIndex < COLS_B显式校验确保安全;同时采用String.format()替代.formatted()(兼容Java 8+)。
关键设计说明:
- 空间优化:matrixB行数与A一致,列数由业务需求预设(本例为2),避免为每行单独分配变长数组,兼顾JVM内存布局效率;
- 语义明确:每个非null元素代表一个有效坐标,null占位清晰表达“该行剩余槽位未使用”,便于下游解析;
- 扩展建议:若需支持任意列宽或返回扁平化列表,可改用List<int[]>或ArrayList<Point>,但本题强调矩阵结构映射,故维持二维数组契约。
此方案直击考试题本质——在固定输出维度下完成稀疏坐标提取,兼具正确性、可读性与工程实用性。


















