【问题标题】:How to find sum of elements above secondary diagonal in matrix?如何找到矩阵中次对角线以上的元素之和?
【发布时间】:2021-12-31 07:02:08
【问题描述】:

我尝试搜索此问题的解决方案一段时间,但找不到任何东西。如何在 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);
}

【问题讨论】:

  • 给出示例数据以及如何手动计算。
  • 您不应在 Java 中的标识符中使用 $。虽然$ 是合法的,但它的使用仅限于 Java 工具链本身和第 3 方工具。如果您在代码中使用$,您可能会编写不小心与...生成的代码发生冲突的代码。

标签: java matrix multidimensional-array sum diagonal


【解决方案1】:

对于任何顺序的方阵,您都可以使用此代码,

此代码对主对角线和次对角线都有答案,并由代码中的 cmets 分隔

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[] 集合中的元素相加,不包括第二个对角线元素。

【讨论】:

    【解决方案2】:

    如果不包含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
    

    【讨论】:

      【解决方案3】:

      第 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);
      
      }
      

      【讨论】:

        猜你喜欢
        • 2019-04-22
        • 2016-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多