【问题标题】:Java - find consecutive elements in 2D arrayJava - 在二维数组中查找连续元素
【发布时间】:2020-06-08 15:41:55
【问题描述】:

我遇到了算法问题,假设如下: 一个电影院有 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;
    }

【问题讨论】:

  • 首先,在第一个循环之后初始化您的座位计数器变量,使其每行从 0 开始,并更正您的逻辑以增加它。

标签: java search multidimensional-array


【解决方案1】:

以下是您需要的 4 个提示:

  1. 不要比较matrix[r][c] == matrix[r][c + 1]。简单地与 0 比较: matrix[r][c] == 0。避免ArrayIndexOutOfBoundsException

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

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

  4. 还有!当你打印出System.out.println(rowWithAvailableSeats) 时,记住行数是从 0 开始的。

【讨论】:

    【解决方案2】:

    希望对你有帮助

    1. 在 main() 方法中,您将矩阵从索引 0 设置为 rows-1,从索引 0 设置为 columns-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. 如果您正在寻找相邻的座位,那么您需要在访问已售座位时重置座位计数器 (matrix[r][c] == 1)
    4. 您还需要为每一排重置座位计数器。

    【讨论】:

      【解决方案3】:

      我会将每一行放在一个字符串中,并将所有行放在一个字符串数组 a[m] 中,然后对每一行执行 a[i].contains(k): "1001101110100010110010".contains("000")

      【讨论】:

        【解决方案4】:

        您的 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])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-28
          • 2017-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多