我正在解决一个问题,我必须打印数组中所有沙漏中最大的总和。您可以找到有关问题的详细信息 here-
我尝试了什么:
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);
}
}
输入:
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
输出:
12
预期输出:
13
我不知道我哪里做错了。我不明白为什么预期输出是 13
。根据题中给出的描述,应该是10
。这是一个错误的问题还是我对此的理解有误?
最佳答案
删除 if (arr[arr_i][arr_j] > 0)
语句。它会阻止在第 1 行第 0 列找到答案,因为该单元格是 0
。
对您代码的其他改进的评论:
如果最好的沙漏总和是
-4
怎么办?您应该将tmp_sum
初始化为Integer.MIN_VALUE
。并将其命名为maxSum
,以更好地描述其用途。您不应该在循环外定义
sum
。在第一次分配时声明它,然后您不必在之后将其重置为0
。您的迭代器应该只是
i
和j
。这些是整数迭代器的标准名称,并使代码……更简洁。
如果您喜欢更长的名称,请使用row
和col
,因为这就是它们所代表的内容。您不需要在数组查找周围加上括号。
为清楚起见,我对下面的代码进行了格式化,以在数组查找中显示沙漏形状。
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);
关于Java - 如何解决这个二维数组沙漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37363674/