
本文详解如何遍历原始二元矩阵,提取所有值为1的元素行/列坐标,并按行优先顺序紧凑存入目标二维字符串矩阵,同时处理动态尺寸适配与空位填充问题。
本文详解如何遍历原始二元矩阵,提取所有值为1的元素行/列坐标,并按行优先顺序紧凑存入目标二维字符串矩阵,同时处理动态尺寸适配与空位填充问题。
在实际编程题(如OOP考试)中,常需对稀疏二元矩阵进行坐标压缩存储:给定一个含0和1的 m×n 矩阵 A,要求将所有值为 1 的元素的二维坐标(行索引、列索引)按从上到下、从左到右的顺序,依次存入一个较小的二维结果矩阵 B 中。由于 1 的数量通常远少于总元素数,B 一般设计为 k×2 形式(每行存一个坐标对),其中 k 为 1 的总数。
但题目中给出的示例代码存在逻辑偏差——它固定分配了 6×2 的 Matrix_B(即预设6行),却未动态计算所需行数,导致大量 null 占位,且未跳过空行。更合理的实现应分为两步:先统计 1 的个数 → 动态创建 B → 再二次遍历填充。以下是优化后的完整解决方案:
public static String[][] extractOneCoordinates(int[][] matrixA) {
if (matrixA == null || matrixA.length == 0) return new String[0][2];
// Step 1: 统计 1 的总数
int count = 0;
for (int[] row : matrixA) {
for (int val : row) {
if (val == 1) count++;
}
}
// Step 2: 创建恰好容纳所有坐标的矩阵 B(count 行 × 2 列)
String[][] matrixB = new String[count][2];
// Step 3: 二次遍历,填充坐标(行优先,自然顺序)
int idx = 0;
for (int i = 0; i < matrixA.length; i++) {
for (int j = 0; j < matrixA[i].length; j++) {
if (matrixA[i][j] == 1) {
matrixB[idx][0] = String.valueOf(i); // 行索引
matrixB[idx][1] = String.valueOf(j); // 列索引
idx++;
}
}
}
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 = extractOneCoordinates(A);
// 输出(5行,因共5个1):
// [["0", "6"],
// ["2", "1"],
// ["3", "0"],
// ["4", "1"],
// ["4", "3"]]✅ 关键要点总结:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 避免硬编码尺寸:不可预先设定 B 的行数(如 6×2),必须根据实际 1 的数量动态分配;
- 坐标格式灵活:若需字符串格式如 "(0,6)",可在填充时使用 String.format("(%d,%d)", i, j);
- 空值风险规避:使用 String[][] 时,未赋值位置默认为 null,生产环境建议用 int[][] 存储原始整型坐标以避免空指针;
- 时间复杂度:O(m×n),空间复杂度 O(k)(k 为 1 的个数),符合稀疏矩阵处理最优实践。
该方案兼顾可读性、健壮性与教学示范性,是解决此类“坐标提取+压缩存储”问题的标准范式。
立即学习“Java免费学习笔记(深入)”;

















