Java - 如何解决这个二维阵列沙漏?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/37363674/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 19:14:18  来源:igfitidea点击:

Java - How to Solve this 2D Array Hour Glass?

javaarraysmultidimensional-arrayhourglass

提问by RajSharma

I am working on a problem where I've to print the largest sum among all the hourglasses in the array. You can find the details about the problem here-

我正在解决一个问题,我必须在数组中的所有沙漏中打印最大的总和。您可以在此处找到有关问题的详细信息-

What I tried:

我试过的:

public class Solution {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int arr[][] = new int[6][6];
        for (int arr_i = 0; arr_i < 6; arr_i++) {
            for (int arr_j = 0; arr_j < 6; arr_j++) {
                arr[arr_i][arr_j] = in.nextInt();
            }
        }

        int sum = 0;
        int tmp_sum = 0;
        for (int arr_i = 0; arr_i < 4; arr_i++) {
            for (int arr_j = 0; arr_j < 4; arr_j++) {
                if (arr[arr_i][arr_j] > 0) {
                    sum = sum + (arr[arr_i][arr_j]) + (arr[arr_i][arr_j + 1]) + (arr[arr_i][arr_j + 2]);
                    sum = sum + (arr[arr_i + 1][arr_j + 1]);
                    sum = sum + (arr[arr_i + 2][arr_j]) + (arr[arr_i + 2][arr_j + 1]) + (arr[arr_i + 2][arr_j + 2]);
                    if (tmp_sum < sum) {
                        tmp_sum = sum;
                    }
                    sum = 0;
                }
            }
        }
        System.out.println(tmp_sum);
    }
}

Input:

输入:

1 1 1 0 0 0
0 1 0 0 0 0
1 1 1 0 0 0
0 9 2 -4 -4 0
0 0 0 -2 0 0
0 0 -1 -2 -4 0

Output:

输出:

12

Expected Output:

预期输出:

13

Screenshot:enter image description here

截屏:在此处输入图片说明

I don't know where I'm doing wrong. I cannot understand why the expected output is 13. According to the description given in the problem it should be 10. Is this a wrong question or my understanding about this is wrong?

我不知道我哪里做错了。我不明白为什么预期的输出是13. 根据问题中给出的描述应该是10。这是一个错误的问题还是我对此的理解是错误的?

采纳答案by Andreas

Remove the if (arr[arr_i][arr_j] > 0)statement. It prevents finding the answer at row 1, column 0, because that cell is 0.

删除if (arr[arr_i][arr_j] > 0)声明。它阻止在第 1 行第 0 列找到答案,因为该单元格是0

Comments for other improvements to your code:

对代码的其他改进的评论:

  • What if the best hourglass sum is -4? You should initialize tmp_sumto Integer.MIN_VALUE. And name it maxSum, to better describe it's purpose.

  • You shouldn't define sumoutside the loop. Declare it when it is first assigned, then you don't have to reset it to 0afterwards.

  • Your iterators should be just iand j. Those are standard names for integer iterators, and keeps code ... cleaner.
    If you prefer longer names, use rowand col, since that is what they represent.

  • You don't need parenthesis around the array lookups.

  • For clarity, I formatted the code below to show the hourglass shape in the array lookups.

  • 如果最好的沙漏总和是-4什么?您应该初始化tmp_sumInteger.MIN_VALUE. 并命名它maxSum,以更好地描述它的目的。

  • 你不应该sum在循环之外定义。在第一次分配时声明它,然后您不必将其重置为0之后。

  • 你的迭代器应该只是iand j。这些是整数迭代器的标准名称,并保持代码......更干净。
    如果您更喜欢更长的名称,请使用rowcol,因为这就是它们所代表的意思。

  • 数组查找不需要括号。

  • 为了清楚起见,我格式化了下面的代码以在数组查找中显示沙漏形状。

Scanner in = new Scanner(System.in);
int arr[][] = new int[6][6];
for (int i = 0; i < 6; i++){
    for (int j = 0; j < 6; j++){
        arr[i][j] = in.nextInt();
    }
}

int maxSum = Integer.MIN_VALUE;
for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {
        int sum = arr[i    ][j] + arr[i    ][j + 1] + arr[i    ][j + 2]
                                + arr[i + 1][j + 1]
                + arr[i + 2][j] + arr[i + 2][j + 1] + arr[i + 2][j + 2];
        if (maxSum < sum) {
            maxSum = sum;
        }
    }
}
System.out.println(maxSum);

回答by M.dinesh

import java.io.*;
import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int low = -9,high = 5;
        int lh = low * high;
        int sum = 0, i, j;
        int max = 0;
        int a[][] = new int[6][6];
        for (i = 0; i < 6; i++) {
            for (j = 0; j < 6; j++) {
                a[i][j] = in.nextInt();
            }
        }

        for (i = 0; i < 4; i++) {
           for (j = 0; j < 4; j++) {
               sum = (a[i][j] + a[i][j+1] + a[i][j+2]); 
               sum = sum + a[i+1][j+1];
               sum = sum + (a[i+2][j] + a[i+2][j+1] + a[i+2][j+2]);

               if (sum > lh) lh = sum;
            }
        }
        System.out.print(lh);
    }
}

回答by Stuti Bisht

Here you go..

干得好..

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int a[][] = new int[6][6];
    int max = 0;
    for (int i = 0; i < 6; i++) {
        for (int j = 0; j < 6; j++) {
            a[i][j] = in.nextInt();
        }
    }
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            int sum = a[i][j] + a[i][j + 1] + a[i][j + 2] + a[i + 1][j + 1]
                    + a[i + 2][j] + a[i + 2][j + 1] + a[i + 2][j + 2];
            if (sum > max || (i == 0 && j == 0)) {
                max = sum;
            }
        }
    }
    System.out.println(max);
}

回答by sean le roy

This was my solution. I wrapped an if statement around the code that calculates the sum, that makes sure we don't go out of bounds.

这是我的解决方案。我在计算总和的代码周围包裹了一个 if 语句,以确保我们不会越界。

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int arr[][] = new int[6][6];
    int max = Integer.MIN_VALUE;
    int tempMax = 0;

    for(int i=0; i < 6; i++){
        for(int j=0; j < 6; j++){
            arr[i][j] = in.nextInt();
        }
    }

    for(int i=0; i < 6; i++){
        for(int j=0; j < 6; j++){
            if (i + 2 < 6 && j + 2 < 6) {
                tempMax += arr[i][j] + arr[i][j + 1] + arr[i][j + 2];
                tempMax += arr[i + 1][j + 1];
                tempMax += arr[i + 2][j] + arr[i + 2][j + 1] + arr[i + 2][j + 2];

                if (max < tempMax) {
                    max = tempMax;
                } 

                tempMax = 0;
            }           
        }
    }

    System.out.println(max);
}

回答by ABajpai

Here's the simple and easy to understand C# equivalent code for your hourglass problem.

下面是针对沙漏问题的简单易懂的 C# 等效代码。

class Class1
{
    static int[][] CreateHourGlassForIndex(int p, int q, int[][] arr)
    {
        int[][] hourGlass = new int[3][];

        int x = 0, y = 0;
        for (int i = p; i <= p + 2; i++)
        {
            hourGlass[x] = new int[3];
            int[] temp = new int[3];
            int k = 0;
            for (int j = q; j <= q + 2; j++)
            {
                temp[k] = arr[i][j];
                k++;
            }
            hourGlass[x] = temp;
            x++;
        }

        return hourGlass;
    }

    static int findSumOfEachHourGlass(int[][] arr)
    {
        int sum = 0;
        for (int i = 0; i < arr.Length; i++)
        {
            for (int j = 0; j < arr.Length; j++)
            {
                if (!((i == 1 && j == 0) || (i == 1 && j == 2)))
                    sum += arr[i][j];
            }

        }

        return sum;
    }

    static void Main(string[] args)
    {
        int[][] arr = new int[6][];
        for (int arr_i = 0; arr_i < 6; arr_i++)
        {
            string[] arr_temp = Console.ReadLine().Split(' ');
            arr[arr_i] = Array.ConvertAll(arr_temp, Int32.Parse);
        }

        int[] sum = new int[16];
        int k = 0;
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                int[][] hourGlass = CreateHourGlassForIndex(i, j, arr);
                sum[k] = findSumOfEachHourGlass(hourGlass);
                k++;
            }
        }
        //max in sum array
        Console.WriteLine(sum.Max());

    }
}

Happy Coding. Thanks, Ankit Bajpai

快乐编码。谢谢, Ankit Bajpai

回答by Ashishkumar Teotia

You can try this code:
I think this will be easy to understand for beginners.

你可以试试这个代码:
我认为这对初学者来说很容易理解。

public class Solution {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int arr[][] = new int[6][6];
        for(int arr_i=0; arr_i < 6; arr_i++){
            for(int arr_j=0; arr_j < 6; arr_j++){
                arr[arr_i][arr_j] = in.nextInt();
            }
        }
        int sum = 0;
        int sum2 = 0;
        int sum3 = 0;
        int x = 0;
        int max = Integer.MIN_VALUE;
        for(int i = 0; i < 4; i++){
            for(int j = 0; j < 4; j++){
                for(int k = 0; k < 3; k++){
                    sum += arr[i][j+k]; //top elements of hour glass
                    sum2 += arr[i+2][j+k]; //bottom elements of hour glass
                    sum3 = arr[i+1][j+1]; //middle elements of hour glass
                    x = sum + sum2 + sum3; //add all elements of hour glass
                }
                if(max < x){
                    max  = x;
                }
                sum = 0; 
                sum2 = 0; 
                sum3 = 0;
                x = 0;
            }            
        }
        System.out.println(max);
    }
}

回答by palslav

Here is another easy option, hope it helps:

这是另一个简单的选择,希望它有所帮助:

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int a[][] = new int[6][6];
        for(int i=0; i < 6; i++){
            for(int j=0; j < 6; j++){
                a[i][j] = in.nextInt();
            }
        }
        int hg = Integer.MIN_VALUE, sum;
        for(int i=0; i<4; i++){
            for(int j=0; j<4; j++){
               sum = 0;
               sum = sum + a[i][j] + a[i][j+1] + a[i][j+2];
               sum = sum + a[i+1][j+1];
               sum = sum + a[i+2][j] + a[i+2][j+1] + a[i+2][j+2];
               if(sum>hg)
                   hg = sum;
            }
        }
        System.out.println(hg);
        in.close();
    }
}

回答by chitrendra chaudhary

there is another opetion in case of -(minus) and zero output we can use shorted ser Treeset for the same . below is the sameple code

在 -(minus) 和零输出的情况下还有另一个选项,我们可以使用短路的 ser Treeset 来实现相同的 . 下面是相同的代码

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int arr[][] = new int[6][6];

        for(int i=0; i < 6; i++){
            for(int j=0; j < 6; j++){
                arr[i][j] = in.nextInt();
            }
        }

        int sum=0;int output=0;
        Set<Integer> set=new TreeSet<Integer>();

        for(int k=0;k<4;k++ )
        {
            for(int y=0;y<4;y++)
            {
                sum=arr[k][y]+arr[k][y+1]+arr[k][y+2]+arr[k+1][y+1]+arr[k+2][y]+arr[k+2][y+1]+arr[k+2][y+2];                                         set.add(sum);
            }
        }

        int p=0;

        for(int u:set)
        {
            p++;
            if(p==set.size())
            output=u;
        }

        System.out.println(output);
    }
}

回答by Golam Mahmud Rafi

Solved in PHP, may be helpful.

在PHP中解决,可能会有所帮助。

<?php

$handle = fopen ("php://stdin","r");
$input = [];

while(!feof($handle))
{
   $temp = fgets($handle);
   $input[] = explode(" ",$temp);
}

$maxSum = PHP_INT_MIN;
for($i=0; $i<4; $i++)
{
    for($j=0; $j<4; $j++)
    {
        $sum = $input[$i][$j] + $input[$i][$j + 1] + $input[$i][$j + 2] 
                                    + $input[$i + 1][$j + 1] + 
                  $input[$i + 2][$j] + $input[$i + 2][$j + 1] + $input[$i + 2][$j + 2]; 

        if($sum > $maxSum)
        {
            $maxSum = $sum;
        }
    }
}
echo $maxSum;

?>

回答by Aravinth Sundaram

Passes all test cases

通过所有测试用例

import java.io.*;
import java.util.*;

public class Solution {

public static void main(String[] args) {
    Scanner read = new Scanner(System.in);
    int rowSize = 6;
    int colSize = 6;
    int[][] array = new int[rowSize][colSize];
    for(int row = 0; row < rowSize; row++) {
        for(int col = 0; col < colSize; col++) {
            array[row][col] = read.nextInt();
        }
    }
    read.close();
    int max = Integer.MIN_VALUE;
    for(int row = 0; row < 4; row++) {
        for(int col = 0; col < 4; col++) {
            int sum = calculateHourglassSum(array, row, col);
            if(sum > max) {
                max = sum;
            }
        }
    }
    System.out.println(max);
}

private static int calculateHourglassSum(int[][] array, int rowIndex, int colIndex) {
    int sum = 0;
    for(int row = rowIndex; row < rowIndex + 3; row++) {
        for(int col = colIndex; col < colIndex + 3; col++) {
            if(row == rowIndex + 1 && col != colIndex + 1) {
                continue;
            }
            sum += array[row][col];
        }
    }
    return sum;
}
}