如何找到矩阵中次对角线上元素的总和?
How to find sum of elements above secondary diagonal in matrix?
我试过一段时间寻找这个问题的解决方案,但找不到任何东西。如何在 Java?
中对矩阵中次对角线上方的元素求和(仅使用循环,没什么特别的)
这是我试过的:
public static void Page106Ex3$H(int[][] mat) {
int sum = 0;
for (int i = 1; i < mat.length; i++) {
for (int j = i-1; j >= 0; j--) {
sum += mat[i][j];
}
}
System.out.println("Sum: " + sum);
}
第 i 行中的次要对角线元素出现在 (mat.length-i-1)。在一行中,出现在次对角线上的元素之前的所有元素都在次对角线上,我们需要添加它们。
以下解决方案考虑从 0 开始索引。
public static void Page106Ex3$H(int[][] mat) {
int sum = 0;
int n = mat.length;
for (int i = 0; i < n; i++) {
int j = n - i - 2; // index of element just before the
// secondary diagonal element in row i
while(j >= 0){
sum += mat[i][j];
j--;
}
}
System.out.println("Sum: " + sum);
}
对于任何顺序的方阵,您可以使用此代码,
此代码有主对角线和次对角线的答案,并在代码中用注释分隔
private static void calcDiagonalSumMatrix(int[][] mat) {
int sum = 0, leftDiagonal = 0, rightDiagonal = mat[0].length - 1;
//This loop is for primary diagonal
for (int[] ints : mat) {
sum += ints[leftDiagonal++];
}
//This loop is for secondary diagonal
for(int [] intArray: mat) {
sum += intArray[rightDiagonal--];
}
//This loop is what you have to use
for(int x = 0; x < matrix.length; x++) {
rightDiagonal--;
for(int y = rightDiagonal; y >=0; y--) {
sum += mat[x][y];
}
}
System.out.println(sum);
}
解释:
三个整型变量声明一个求和然后leftDiagonal
是计算左上角到右下角的索引,rightDiagonal
作为索引右上角到左下角的对角线。
然后使用增强的for循环或foreach循环,计算左对角线和右对角线的总和。
在左对角线的每个for循环中,循环首先选择第一组数组然后作为索引的leftDiagonal
变量将从0开始并在每个循环中增加一个rightDiagonal
也是如此,除了右对角线从 order - 1
开始,它是右上角元素的索引。
然后第三个循环实际上有两个循环,外层循环将获取 int 数组元素然后最内层循环将遍历第一个循环所获取的元素并将每个元素相加int[] 设置不包括次要对角线元素。
如果secondary上的元素不包括在内,嵌套循环中的列数应该从0开始递减索引。
public static int sumOver2ndDiagonal(int[][] arr) {
int sum = 0;
for (int i = 0, n = arr.length - 1; i < n; i++) {
for (int j = 0, m = arr[i].length - 1 - i; j < m; j++) {
sum += arr[i][j];
}
}
return sum;
}
测试:
System.out.println(sumOver2ndDiagonal(
new int[][]{
{ 1, 2, 3, 4},
{ 5, 6, 7, 8},
{ 9, 10, 11, 12},
{13, 14, 15, 16}
}
));
// 1 + 2 + 3 + 5 + 6 + 9
// -> 26
我试过一段时间寻找这个问题的解决方案,但找不到任何东西。如何在 Java?
中对矩阵中次对角线上方的元素求和(仅使用循环,没什么特别的)这是我试过的:
public static void Page106Ex3$H(int[][] mat) {
int sum = 0;
for (int i = 1; i < mat.length; i++) {
for (int j = i-1; j >= 0; j--) {
sum += mat[i][j];
}
}
System.out.println("Sum: " + sum);
}
第 i 行中的次要对角线元素出现在 (mat.length-i-1)。在一行中,出现在次对角线上的元素之前的所有元素都在次对角线上,我们需要添加它们。
以下解决方案考虑从 0 开始索引。
public static void Page106Ex3$H(int[][] mat) {
int sum = 0;
int n = mat.length;
for (int i = 0; i < n; i++) {
int j = n - i - 2; // index of element just before the
// secondary diagonal element in row i
while(j >= 0){
sum += mat[i][j];
j--;
}
}
System.out.println("Sum: " + sum);
}
对于任何顺序的方阵,您可以使用此代码,
此代码有主对角线和次对角线的答案,并在代码中用注释分隔
private static void calcDiagonalSumMatrix(int[][] mat) {
int sum = 0, leftDiagonal = 0, rightDiagonal = mat[0].length - 1;
//This loop is for primary diagonal
for (int[] ints : mat) {
sum += ints[leftDiagonal++];
}
//This loop is for secondary diagonal
for(int [] intArray: mat) {
sum += intArray[rightDiagonal--];
}
//This loop is what you have to use
for(int x = 0; x < matrix.length; x++) {
rightDiagonal--;
for(int y = rightDiagonal; y >=0; y--) {
sum += mat[x][y];
}
}
System.out.println(sum);
}
解释:
三个整型变量声明一个求和然后
leftDiagonal
是计算左上角到右下角的索引,rightDiagonal
作为索引右上角到左下角的对角线。然后使用增强的for循环或foreach循环,计算左对角线和右对角线的总和。
在左对角线的每个for循环中,循环首先选择第一组数组然后作为索引的
leftDiagonal
变量将从0开始并在每个循环中增加一个rightDiagonal
也是如此,除了右对角线从order - 1
开始,它是右上角元素的索引。然后第三个循环实际上有两个循环,外层循环将获取 int 数组元素然后最内层循环将遍历第一个循环所获取的元素并将每个元素相加int[] 设置不包括次要对角线元素。
如果secondary上的元素不包括在内,嵌套循环中的列数应该从0开始递减索引。
public static int sumOver2ndDiagonal(int[][] arr) {
int sum = 0;
for (int i = 0, n = arr.length - 1; i < n; i++) {
for (int j = 0, m = arr[i].length - 1 - i; j < m; j++) {
sum += arr[i][j];
}
}
return sum;
}
测试:
System.out.println(sumOver2ndDiagonal(
new int[][]{
{ 1, 2, 3, 4},
{ 5, 6, 7, 8},
{ 9, 10, 11, 12},
{13, 14, 15, 16}
}
));
// 1 + 2 + 3 + 5 + 6 + 9
// -> 26