Java 中二维数组中的最大数字 [已关闭]

Largest digit in 2D array in Java [closed]

提问人:raddan 提问时间:11/12/2023 最后编辑:derpirscherraddan 更新时间:11/13/2023 访问量:66

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

7天前关闭。

给定一个整数二维数组,找到最大的,使得在数组的任何一行中,存在一个大于或等于的元素。A[1..5, 1..5]KK

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Scanner;

public class Solution {

    public static void main(String[] args) throws FileNotFoundException {
        Scanner scan = new Scanner(new File("input.txt"));
        PrintStream out = new PrintStream(new File("output.txt"));

        // Create a 2D array to store the input data
        int[][] array = new int[5][5];

        // Read data from the input file into the 2D array
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                    array[i][j] = scan.nextInt();
            }
        }

        // Find the maximum K
        int maxK = Integer.MIN_VALUE;
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (array[i][j] > maxK) {
                    maxK = array[i][j];
                }
            }
        }

        // Write the result to the output file
        out.println(maxK);
    }
}

我编写了一个错误地解决了这个问题的程序,我需要帮助。据我了解,我需要找到阈值,超过该阈值的数字等于或大于此阈值,但我不知道如何解决它。

下面是一个测试用例,用于验证我的代码是否正确解决:

输入.txt:

 6  7  9  4  5
 7  0  2  5  6
 5  7 -7  1  7
 5  2  2  8  4
 1  3  3  4  5

预期输出:

5

但是,我的程序给出以下输出: 9

请帮我解决这个问题。

Java 数组

评论

0赞 tgdavies 11/12/2023
在调试器下运行程序,逐步执行它并考虑您正在做什么。

答:

1赞 derpirscher 11/12/2023 #1

Your 是数组的总最大值(即所有元素的总最大值)。但是对于您的任务,您必须找到每行的最大值。然后是其中的最小值......maxKK

int k = Integer.MAX_VALUE;
for (int i = 0; i < numberOfRows; i++) {
  int m = Integer.MIN_VALUE;
  for (int j = 0; j < numberOfColumns; j++) {
    int v = scanner.nextInt();
    if (v > m) m = v;  //find the maximum of the current row
  }
  if (m < k) k = m; //compare the maximum to the current k
}

out.println(k);
1赞 Oleg Cherednik 11/12/2023 #2

这个问题很容易。您只需要找到每行的编号并找到所有数字的值。maxminmax

这个问题可以随着时间的推移而解决。O(N)

public static int findLargest(int[][] arr) {
    int k = Integer.MAX_VALUE;

    for (int row = 0; row < arr.length; row++) {
        int maxRow = Integer.MIN_VALUE;

        for (int col = 0; col < arr[row].length; col++)
            maxRow = Math.max(maxRow, arr[row][col]);

        k = Math.min(k, maxRow);
    }

    return k;
}
-1赞 Reilas 11/13/2023 #3

"...我编写了一个程序,错误地解决了这个问题......”

要前言,请确保关闭 Closeable 对象。

典型的方法是使用 try-with-resources 语句

try (Scanner scan = new Scanner(new File("input.txt"))) {
    try (PrintStream out = new PrintStream("output.txt")) {
        
    }
}

"...据我了解,我需要找到阈值,超过该阈值的数字等于或大于此阈值,但我不知道如何解决它。..."

遍历数组,并遍历每个元素。

// Find the maximum K
int maxK = array[0][0];
for (int[] r : array)
    for (int v : r) if (v >= maxK) maxK = v;

这是完整的重构。

try (Scanner scan = new Scanner(new File("input.txt"))) {
    // Create a 2D array to store the input data
    int[][] array = new int[5][5];

    // Read data from the input file into the 2D array
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            array[i][j] = scan.nextInt();
        }
    }

    // Find the maximum K
    int maxK = array[0][0];
    for (int[] r : array)
        for (int v : r) if (v >= maxK) maxK = v;

    try (PrintStream out = new PrintStream("output.txt")) {
        // Write the result to the output file
        out.println(maxK);
    }
}

为了进行演示,下面是一个使用的示例。

try (Scanner scan = new Scanner(new File("input.txt")).useDelimiter("\\R")) {
    // Find the maximum K
    int maxK
        = scan.tokens()
              .mapToInt(x -> Stream.of(x.trim().split(" +"))
                                   .mapToInt(Integer::parseInt)
                                   .max()
                                   .getAsInt())
              .max()
              .getAsInt();

    try (PrintStream out = new PrintStream("output.txt")) {
        // Write the result to the output file
        out.println(maxK);
    }
}

评论

0赞 derpirscher 11/15/2023
不错的重构,但仍然会给你错误的答案。即数组的总最大值。OP已经有这个...