寻找二维数组中每行首个1最靠左的行索引
找出二维数组中首个1最靠左的行索引
给定二维数组:
{0, 0, 1, 1, 1}, {0, 0, 1, 1, 1}, {0, 0, 1, 1, 1}, {0, 1, 0, 0, 1}
需要找到首个1最靠近左侧的行(本例中是索引为3的行),并输出该行索引。
现有代码的问题
你当前的代码存在两个核心问题:
- 使用
HashMap存储j(列索引)和count是逻辑错误的:如果多个行的首个1在同一列,后续数据会覆盖之前的;而且我们需要关联的是行索引和其首个1的列索引,而非列索引和计数。 count变量完全多余:从j=0开始遍历,遇到非1就count++,最终count的值和j是完全相等的,没必要单独维护。
修正后的解决方案
我们只需要维护两个变量:记录当前最小列索引的minColumn,以及对应的行索引resultRow,遍历过程中实时比较更新即可。
public class Main { public static void main(String[] args) { int array[][] = { {0, 0, 1, 1, 1}, {0, 0, 1, 1, 1}, {0, 0, 1, 1, 1}, {0, 1, 0, 0, 1} }; // 初始化最小列索引为数组列数(确保大于所有有效列索引) int minColumn = array[0].length; int resultRow = -1; for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { if (array[i][j] == 1) { // 找到当前行首个1,比较列索引是否更小 if (j < minColumn) { minColumn = j; resultRow = i; } // 找到首个1后跳出内层循环,无需继续遍历该行 break; } } } // 输出结果 System.out.println(resultRow); } }
逻辑说明
- 初始化:
minColumn设为数组的列数,保证第一次找到的1的列索引一定会比它小,确保初始值有效。 - 遍历行:外层循环逐个遍历每一行(
i为行索引)。 - 找首个1:内层循环从左到右遍历当前行,找到第一个值为1的元素时,立即比较其列索引
j和minColumn:- 如果
j更小,说明当前行的首个1更靠左,更新minColumn和resultRow。 - 跳出内层循环,避免无效遍历。
- 如果
- 输出结果:遍历完成后,
resultRow就是首个1最靠左的行索引。
边界补充(可选)
如果存在全为0的行,可以在内层循环后判断是否找到1,避免干扰结果:
for (int i = 0; i < array.length; i++) { boolean foundOne = false; for (int j = 0; j < array[i].length; j++) { if (array[i][j] == 1) { foundOne = true; if (j < minColumn) { minColumn = j; resultRow = i; } break; } } // 可选:输出无1的行 if (!foundOne) { System.out.println("行" + i + "中没有1"); } }
内容的提问来源于stack exchange,提问作者Matthew Masody
相关产品推荐
相关产品推荐

