Java-在2D数组中查找连续元素

时间:2020-06-08 15:41:55

标签: java search multidimensional-array

我在算法上遇到麻烦,假设以下几点: 电影院有n行,每行包含m个座位(n和m不超过20个)。二维矩阵存储有关已售出票证的信息,数字1表示该场所的票证已售出,数字0表示该场所可用。您想购买k张到同一行中相邻座位的门票。查找是否可以完成。

输入数据

在输入中,程序将获取n行和m个席位的数量。然后,有n行,每行包含以空格分隔的m个数字(0或1)。最后一行包含数字k。

输出数据

程序应输出具有k个连续可用座位的行号。如果有几排具有k个可用座位,则输出具有这些座位的第一行。如果没有这样的行,则输出数字0。

代码

import java.util.Scanner;

class Main {
    static int findRowWithAvailableSeat(int[][] matrix, int tickets) {
        final int rows = matrix.length;
        final int columns = matrix[0].length;
        int seatCounter = 0;

        for (int r = 1; r <= rows; r++) {
            for (int c = 1; c <= columns; c++) {
                if (matrix[r][c] == 1) {
                    continue;
                } if (matrix[r][c] == matrix[r][c + 1]) {
                    seatCounter++;
                    if (seatCounter == tickets) {
                        return r;
                    }
                }
            }
        }
        return 0;
    }


    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int rows = scanner.nextInt();
        int columns = scanner.nextInt();

        int[][] matrix = new int[rows][columns];
        for (int r = 0; r < rows; r++) {
            for (int c = 0; c < columns; c++) {
                matrix[r][c] = scanner.nextInt();
            }
        }
        int kTickets = scanner.nextInt();
        int rowWithAvailableSeats = findRowWithAvailableSeat(matrix, kTickets);
        System.out.println(rowWithAvailableSeats);
    }
}

我知道问题出在findRowWithAvailableSeat方法中。我想提示如何解决问题,而不是实际解决方案。非常感谢。

编辑

我终于可以解决它了(或者至少它能按预期工作,我不确定这是否是最好的实现)。谢谢大家的提示。

   static int findRowWithAvailableSeat(int[][] matrix, int tickets) {
        final int rows = matrix.length;
        final int columns = matrix[0].length;
        int seatCounter;

        for (int r = 0; r < rows; r++) {
            seatCounter = 0;
            for (int c = 0; c < columns; c++) {
                if (matrix[r][c] == 1) {
                    seatCounter = 0;
                    continue;
                }
                if (matrix[r][c] == 0) {
                    seatCounter++;
                    if (seatCounter == tickets) {
                        return r + 1;
                    }
                }
            }
        }
        return 0;
    }

4 个答案:

答案 0 :(得分:0)

希望这会有所帮助

  1. 在main()方法上,将矩阵从索引0设置为1行,从索引0设置为1列。但是在findRowWithAvailableSeat()上,您从索引1开始。因此将永远不会访问索引0。
  2. } if (matrix[r][c] == matrix[r][c + 1]) {此行将尝试访问索引c + 1,将导致索引超出范围。您需要检查c + 1是否小于列大小,或者将matrix [r] [c]与0(matrix [r] [c] == 0)进行比较。
  3. 如果您要寻找相邻的座位,那么当您访问售出的座位时(矩阵[r] [c] == 1),您需要重置seatCounter
  4. 您还需要为每一行重置seatCounter。

答案 1 :(得分:0)

您的for循环从1开始而不是0

for (int r = 1; r <= rows; r++) {
    for (int c = 1; c <= columns; c++) {
        if (matrix[r][c] == 1) {

正在跳过矩阵数组的第一个索引。因此,您不必检查第一行和每一行的第一位。

此外,seatCounter并未为每一行重置。目前,它保留了前几行计数的所有席位。

我也不知道这是干什么的

if (matrix[r][c] == matrix[r][c + 1])

答案 2 :(得分:0)

我将每一行放入一个字符串中,并将所有行放入一个字符串数组a [m]中,然后在每一行上执行a [i] .contains(k): “ 1001101110100010110010”。包含(“ 000”)

答案 3 :(得分:0)

这是您需要的4个提示:

  1. 请勿比较matrix[r][c] == matrix[r][c + 1]。普通比较为0: matrix[r][c] == 0。为了避免ArrayIndexOutOfBoundsException

  2. 正如DarkSigma所指出的那样,从0而不是1开始循环迭代器:for (int r = 0; r < rows...

  3. 将每行的seatCounter重新初始化为0。

  4. 然后!打印出System.out.println(rowWithAvailableSeats)时,请记住行计数从0开始。

相关问题