二维数组

1,编写一个方法,求整数矩阵中特定列的所有元素的和,使用下面的方法头
public static double sumColumn(double [][] m,int columnIndex){
编写一个测试的程序,读取一个3*4的矩阵,然后显示每列元素的和
思路:1,求列的元素和,就是列不变,行改变
2,求行元素的和,就是行不变,列改变

class test59{
    public static void main(String [] args){
        //求一个3*4矩阵的列之和And行之和
        double [][]m={
            {1,2,3,4},
            {5,6,7,8},
            {3,4,5,2}
        };
        //遍历列
        for(int columnIndex=0;columnIndex<m[0].length;columnIndex++){
                  System.out.println(sumColumn(m, columnIndex));
        }

    }
    public static double sumColumn(double [][] m,int columnIndex){
          int sum=0;
          //求出特定列元素的和
        for(int row=0;row<m.length;row++){
           sum+=m[row][columnIndex];
        }
        return sum;
    }
}

2,编写一个方法,求nn的double类型矩阵主对角线上所有元素的和,使用下面的方法头:
public static double sumMajorDiagonal(double [] [] m)
编写一个程序,读取一个4
4矩阵对角线上所有元素的和

class test510{
    public static void main(String[] args){
        double [][] a={
            {1,2,4,5},
            {3,2,1,5},
            {4,2,7,8},
            {2,4,1,6}
        };
         sumMajorDiagonal(a);
    }
    public static double sumMajorDiagonal(double [][] a){
        double sum1=0;
        double sum2=0;
         //对角线左下方向的
         for(int i=0;i<a.length;i++){
            sum1+=a[i][i];
         }
         System.out.println(sum1);
         //右上方向的
         for(int i=a.length-1;i>=0;i--){
             sum2+=a[i][a.length-1-i];
         } 
         System.out.println(sum2);
         return sum1+sum2;
    }
}

3,代数方面,两个矩阵相乘,编写两个矩阵相乘的方法,方法头如下:
public static double[][] multiplyMatrix(double [][] a,double [][] b)
为使矩阵a和矩阵b能够相乘,矩阵a的列数必须和矩阵b的行数相同
在这里插入图片描述

import java.util.*;
class test511{
    public static void main(String[] args){
        double [][]a={
            {1.0,2.0,3,4},
            {3,1,1,5},
            {2,3,1,7}
        };
        double [][]b={
            {1.0,2.0,3,4},
            {3,1,1,5},
            {2,3,1,7}
        };
    }
    public static double [][] multiplyMatrix(double[][]a,double[][]b){
        //创建一个新数组
        double [][] c=new double[a.length][b[0].length];
        //遍历数组c
        for(int i=0;i<c.length;i++){//遍历数组的行数
             for(int j=0;j<c[0].length;j++){
                 double sum=0;
                 for(int k=0;k<b.length;k++ ){
                      sum+=a[i][k] * b[k][j];
                 }
                 c[i][j]=sum;
             }
        }
             return c;
    }
}

4,编写程序,提示用户输入一个方阵的长度,随机的在方阵中填入0或者1,打印这个方阵,然后找出整行,整列或者对角线都是0或1的行,列和对角线
思路:
对角线分为主对角线和副对角线,主对角线的元素是a[i][i],副对角线是a[i]a.length-1-i
行的元素是a[i]][j],j的范围是for(int j=0;j<a[i].length;j++)
列的元素是a[j]][i],j的范围是for(int j=0;j<a.length;j++).i的范围是for(int i=0;i<a.length;i++)

import java.util.*;
class test512{
    public static void main(String[] args){
        Random random=new Random();
      Scanner scanner =new Scanner(System.in);
      System.out.print("请输入方阵的长度 ");
      int size=scanner.nextInt();
      double [][] a=new double[size][size];
      for(int i=0;i<size;i++){
          for(int j=0;j<size;j++){
              a[i][j]=random.nextInt(2);//取值只取到0 1 取不到2
              System.out.print(a[i][j]);
          }
          System.out.println();
      }  
      checkSubDiagonal(a);
    }
    public static void checkSubDiagonal(double [][]a){
         //比较副对角线的元素是否全零还是全1
         int sum1=0;
         int sum2=0;
         int sum3=0;
         int sum4=0;
    for(int i=0;i<a.length;i++){
        sum1+=a[i][a.length-1-i];
    }
    if(sum1==0|| sum1==a.length){
        System.out.printf("副对角线全相等且等于%d\n",sum1==0?0:1);
    }
    //主对角线元素是否全0还是1
    for(int i=0;i<a.length;i++){
        sum2+=a[i][i];
    }
    if(sum2==0|| sum2==a.length){
        System.out.printf("主对角线全相等且等于%d\n",sum2==0?0:1);
    }
    //行元素是否全0还是1
    for(int i=0;i<a.length;i++){
        for(int j=0;j<a[i].length;j++){
          sum3+=a[i][j];
        }
        if(sum3==0|| sum3==a.length){
            System.out.printf("第%d行全相等且等于%d\n",i+1,sum3==0?0:1);
        } 
    }
    //列元素是否全0还是1
    for(int i=0;i<a.length;i++){
        for(int j=0;j<a.length;j++){
            sum4+=a[j][i];
        }
        if(sum4==0|| sum4==a.length){
            System.out.printf("第%d列全相等且等于%d\n",i+1,sum4==0?0:1);
        }
    }
    }

}

5,编写方法,测试一个二维数组是否有四个连续的数字具有相同的数值,这四个数可以是水平方向的,垂直方向的,对角线方向的
public static boolean isConsecutiveFour(int [][] values)
编写一个测试程序,提示用户输入一个二维数组的行数,列数以及数组中的值,如果这个数组具有四个连续相同的数值,就显示为true,否则显示为false,
思路:主要搞懂这几个方向的元素的下标进行比较即可
这是我写的代码

import java.util.*;
class test513{
    public static void main(String[] args){
      Scanner scanner =new Scanner(System.in);
      System.out.print("请输入row col");
      int row=scanner.nextInt();
      int col=scanner.nextInt();
      int [] [] m=new int[row][col];
      for(int i=0;i<m.length;i++){
          for(int j=0;j<m[i].length;j++){
              m[i][j]=scanner.nextInt();
              System.out.print(m[i][j]+" ");
          }
          System.out.println();
      }
    }
    public static boolean isContinousFour(int [][] m){
        //向右
          for(int i=0;i<m.length;i++){
              boolean flag=true;
              for(int j=0;j<m[i].length;j++){
                  if(j<=m[i].length-4){
                    for(int k=j+1;k<=j+3;k++){
                        if(m[i][j]!=m[i][k]){//反向思维判断
                              flag=false;
                              break;
                        }
                    }
                    if(flag){
                        return true;
                    }
                  }
                  //向下
                  if(i<=m.length-4){
                    for(int r=j+1;r<=j+3;r++){
                        if(m[i][j]!=m[i][r]){//反向思维判断
                              flag=false;
                              break;
                        }
                    }
                    if(flag){
                        return true;
                    }
                  }
              //向右上
              if(i>=3&&j<=m[i].length-4){
                for(int k=j+1,c=i-1;k<=j+3;j++,c++){
                    if(m[i][j]!=m[c][k]){//反向思维判断
                          flag=false;
                          break;
                    }
                }
                if(flag){
                    return true;
                }
              }
              //向右下
              if(i<=m.length-4&&j<=m.length-4){
                for(int r=j+1,c=i+1;c<=i+3;r++,c++){
                    if(m[i][j]!=m[c][r]){//反向思维判断
                          flag=false;
                          break;
                    }
                }
                if(flag){
                    return true;
                }
              }
          }
    }
}

版权声明:本文为qq_37244548原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。