当前位置: 首页 > article >正文

蓝桥杯算法基础(24):多维数组与矩阵(4道小题)java版

题1:顺时针打印二维数组

static void print(int[][] matrix){
    int leftUpRow=0,leftUpCol=0,rightDownRow=matrix.length-1,rightDownCol=matrix[0].length-1;

    while(leftUpRow<=rightUpRow&&leftUpCol<=rightDownCol){
    //在不是方阵的情况下,是扁平的时,左右或是上下间距小的先结束,
    //也就是说最后肯定剩一行,无论是竖着一行还是横着一行,上一行结束后,
    //上下左右边界改变,间距小的合并到一起,当遍历到头时,由于有一个间距已经变为0,
    //有些while循环无法实现,只有间距不为0那个方向可以动,因此当结束时,
    //再次更新边界,两个为0的边界就交叉了,循环结束


    //         leftUpCol
    //leftUpRow    0


    //                     length    rightDownRow
    //                   rightDownCOl



    //两个移动指针
    int r=leftUpRow;
    int c=leftUpCol;

    //上面一条边
    while(c<=rightUpCol){
        System.out.println(matrix[leftUpRow][c++]+" ");
    }
    //恢复
    c=rightDownCol;

    r++;
    //右边的一条边
    while(r<=rightDownRow){
    System.out.println(matrix[r++][leftUpCol]+" ");
    }

    //恢复
    r=rightDownRow;
    c--;

    //下面一条边
    while(c>=RightDown){
    System.out.println(matrix[r][c--]+" ");
    }

    //恢复
    c=leftUpCol;
    r--;
    while(r>leftUpRow){
    System.out.println(matrix[r--][c]);
    }

    一圈后回到左顶角
    leftUpRow++;
    leftUpCol++;
    rightUpRow--;
    rightUpCol--;
    }
}

题2:0所在的行列清零

如果矩阵中某个元素为0,则将其所在行和列清零
1  2  3  4
5  6  0  8
9  0  11 12
13 14 15 16


先记录再求解决
static void solve(int[][] matrix){
 int M=matrix.length;
 int N=matrix[0].length;
 //记录那些行出现了0
 int[] rowRecord=new int[M];
 //记录那些列出现了0
 int[] colRecord=new int[N];
 for(int i=0;i<M;i++){
  for(int j=0;j<N;j++){
     if(matrix[i][j]==0){
    rowRecord[i]=1;
    colRecord[j]=1;
    }
  }
 }

 for(int row=0;row<M;row++){
    for(int col=0;col<N;col++){
    if(rowRecord[row]==1||colRecord[col]==1)
        matrix[row][col]=0;
    }
 }

}

题3:z型打印

1  2  3  4
5  6  7  8
9  10 11 12

static void print(int[][] matrix){
 int r=0;m=matrix.length;//行的长度
 int c=0;n=matrix[0].length;//每一列的长度
    boolean l2r=true;//从左到右
    while(r<m&&c<n){//全都遍历完,才终止条件

    //从左下到右上的斜线,若是到边界,则这个条件结束
    if(12r){
    System.out.println(matrix[r][c]+" ");
    //现在在第一行,列未到边界,这是只能向左走

    //在上和右边界,都要调换方向,从上破转到下坡
    if(r==0&&c<n-1){//走上坡的终止条件,当到达最上方且未到最右方,就往右走一步
    l2r=!l2r;//掉换方向,从上坡到下坡
    c++;
    continue;
    }else if(r>0&&c=n-1){
    l2r=!l2r;
    r++;
    continue;
    }else{//急需走上坡
    r--;
    c++;
    }else{//走上坡结束,该走下坡了
    //在左和下边界,都要调换方向,从下坡上坡
    System.out.println(matrix[i][j]+" ");

    if(c==0&&r<m-1){//走下坡的边界,若是碰到
    l2r=!l2r;
    r++;
    continue;
    }else if(r==m-1){
    l2r=!l2r;
    c++;
    continue;
    }else{

    r++;
    c--;
    }

    }


    }

}

题4:边长为1的最大子方阵

给定一个N*N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度

//外围循环为边长,内层循环为在该边长下,每个点位作为左上顶点,遍历四条边,看是否有0,若有0,则该方阵不成立,若没有0,则此方阵为最大子方阵
private static int solve(int[][] A){
     int N=A.length;
     int n=N;
     while(n>0){
     for(int i=0;i<N;i++){
        l3;
        if(i+n>N)break;//越界
        for(int j=0;j<N;j++){

        if(j+n>N)break;//越界
        //检查四个边
        int r=i,c=j;
        while(c<j+n){
        if(A[r][c++]==0)continue l3;
        }
        c--

        while(c<j+n){
            if(A[r++][c]==0)
            continue l3;
        }
        r--;
        while(c>=j){
        if(A[r][c--]==0)
        continue l3;
        }
        c++;
        while(r>=i){
        if(A[r--][c]==0)
        continue l3;
        }
        //若是都没有退出,则这就最大的边长,因为外围为边长,他是从大到小遍历的

        return n;
        }
     }

     }
}

http://www.kler.cn/a/273842.html

相关文章:

  • 学习记录:C/C++ 中的续行符
  • css出现边框
  • 细说STM32F407单片机以轮询方式读写外部SRAM的方法
  • unity3d-搞个场景漫游如何实现Alpha
  • torch.max和torch.softmax python max
  • Backend - EF Core(C# 操作数据库 DB)
  • [日报] Ribbon、Eureka、Nginx、负载均衡
  • 深入理解Apache Kafka Topic:架构设计与应用场景
  • 【Linux】日常使用命令(三)
  • 保护你的微服务:Sentinel熔断器的原理与应用解析(二)
  • 【vue】深入探讨vue中组件间多种传值方式
  • 蓝桥杯C++大学B组一个月冲刺记录2024/3/18
  • 【DL经典回顾】激活函数大汇总(二十一)(BReLU附代码和详细公式)
  • 身份证文字识别ocr免费-身份证实名认证接口-护照识别-Java调用代码
  • 【ADF4351】使用FPGA进行SPI寄存器配置、使用FPGA计算各个频率的频点,ADF4351配置程序
  • Games101课程笔记1--图形学简介
  • SpringBoot 集成RabbitMQ,简单示例(附源码)
  • 渔业安全生产综合管理指挥系统-航迹数据优化方案
  • XML语言的学习记录3-解析
  • MybatisPlus逆向工程
  • C#类型转换
  • 文件批量管理利器,一键复制备份安全删除原文件,让文件管理更高效!
  • 华岳M9制造企业管理软件业务流程 1/4
  • spring boot 运行mongodb sql
  • 使用 C 或 C++ 扩展 Python
  • 【WEEK3】学习目标及总结【SpringMVC】【中文版】