华为OD机试 - 学生方阵 - 矩阵(Java 2023 B卷 200分)

news2024/9/26 1:22:52

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
      • 1、输入
      • 2、输出
    • 四、解题思路
      • 1、题目解析
      • 2、解体思路
    • 五、Java算法源码
      • 再重新读一遍题目,看看能否优化一下~
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

学校组织活动,将学生排成一个矩形方阵。请在矩形方阵中找到最大的位置相连的男生数量。

这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的.注:学生个数不会超过10000。

二、输入描述

输入的第一行为矩阵的行数和列数,接下来的n行为矩阵元素,元素间用","分隔。

三、输出描述

输出一个整数,表示矩阵中最长的位置相连的男生个数。

1、输入

3,4
F,M,M,F
F,M,M,F
F,F,F,M

2、输出

3

四、解题思路

1、题目解析

本题的解题思路其实不难,遍历查找矩阵中每一个 M 点,然后求该 M 点的水平、垂直、正对角线、反对角线四个方向的 M 点个数,然后保留最大的个数

2、解体思路

  1. 定义矩阵matrix,并初始化;
  2. 定义矩阵中最长的位置相连的男生个数max;
  3. 遍历矩阵,并跳过女生M;
  4. 计算每行相连的男生个数;
  5. 计算每列相连的男生个数;
  6. 计算斜线相连的男生个数;
  7. 计算反斜线相连的男生个数;
  8. 相连最大值。

五、Java算法源码

public class OdTest03 {
    static int m, n = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] input = sc.nextLine().split(",");
        // m行
        m = Integer.valueOf(input[0]);
        // n列
        n = Integer.valueOf(input[1]);
        // 矩阵
        String[][] matrix = new String[m][n];
        for (int i = 0; i < m; i++) {
            String[] line = sc.nextLine().split(",");
            for (int j = 0; j < n; j++) {
                matrix[i][j] = line[j];
            }
        }

        // 矩阵中最长的位置相连的男生个数
        int max = 0;
        // 遍历矩阵
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                String compare = matrix[i][j];
                // 跳过女生M
                if (compare.equals("F")) {
                    continue;
                }

                // 计算每行相连的男生个数
                int rowSame = getSameRowMax(matrix, compare, i, j);
                // 计算每列相连的男生个数
                int columnSame = getSameColumnMax(matrix, compare, i, j);
                // 计算斜线相连的男生个数
                int obliqueSame = getSameObliqueMax(matrix, compare, i, j);
                // 计算反斜线相连的男生个数
                int reverseObliqueSame = getSameReverseObliqueMax(matrix, compare, i, j);
                int maxSame = Integer.max(Integer.max(columnSame, rowSame), Integer.max(obliqueSame, reverseObliqueSame));
                if (maxSame >= max) {
                    max = maxSame;
                }
            }
        }
        System.out.println(max);
    }

    /**
     * 计算每行相连的男生个数
     *
     * @param matrix  矩阵
     * @param compare 待比较字符
     * @param i       行
     * @param j       列
     * @return 相连的男生个数
     */
    private static int getSameRowMax(String[][] matrix, String compare, int i, int j) {
        int same = 1;
        for (int k = j + 1; k < n; k++) {
            // 比较同一行中下一列字符
            if (compare.equals(matrix[i][k])) {
                same++;
            } else {
                // 如果不同,终止遍历,返回当前行相连的男生个数
                break;
            }
        }
        return same;
    }

    // 计算每列相连的男生个数
    private static int getSameColumnMax(String[][] matrix, String compare, int i, int j) {
        int same = 1;
        for (int k = i + 1; k < m; k++) {
            // 比较同一列中的下一行字符
            if (compare.equals(matrix[k][j])) {
                same++;
            } else {
                // 如果不同,终止遍历,返回当前列相连的男生个数
                break;
            }
        }
        return same;
    }

    // 计算斜线相连的男生个数
    private static int getSameObliqueMax(String[][] matrix, String compare, int i, int j) {
        int same = 1;
        for (int k = i + 1; k < m; k++) {
            for (int l = j + 1; l < n; l++) {
                // 比较下一行下一列处于斜线上的下一个字符
                if (compare.equals(matrix[k][l])) {
                    same++;
                } else {
                    // 如果不同,终止遍历,返回当前斜线相连的男生个数
                    return same;
                }
                break;
            }
        }
        return same;
    }

    // 计算反斜线相连的男生个数
    private static int getSameReverseObliqueMax(String[][] matrix, String compare, int i, int j) {
        if (i == 0) {
            return 1;
        }

        int same = 1;
        for (int k = i + 1; k < m; k++) {
            for (int l = j - 1; l >= 0; l--) {
                // 比较下一行下一列处于斜线上的下一个字符
                if (compare.equals(matrix[k][l])) {
                    same++;
                } else {
                    // 如果不同,终止遍历,返回当前斜线相连的男生个数
                    return same;
                }
                break;
            }
        }
        return same;
    }
}

感觉这道题,不至于这么复杂吧。

再重新读一遍题目,看看能否优化一下~

优化关键点:

  1. 定义方向二位数组direction;
  2. 遍历矩阵,如果前一个是M,表示此M已经计算过了,直接跳过;
  3. 简化上面的4种遍历方法,通过累加direction中的横纵坐标,计算每行、每列、斜线、反斜线相连的男生个数,并取相连最大值。
public class OdTest {
    static int m, n = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] input = sc.nextLine().split(",");
        // m行
        m = Integer.valueOf(input[0]);
        // n列
        n = Integer.valueOf(input[1]);
        // 矩阵
        String[][] matrix = new String[m][n];
        for (int i = 0; i < m; i++) {
            String[] line = sc.nextLine().split(",");
            for (int j = 0; j < n; j++) {
                matrix[i][j] = line[j];
            }
        }

        /**
         * 数组的第0位-行、数组的第1位-列
         * {0,1}寻找一行内连续的M
         * {1,0}寻找一列中连续的M
         * {1,1}寻找斜下中连续的M
         * {1,-1}寻找反斜下连续的M
         */
        int[][] direction = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};

        // 矩阵中最长的位置相连的男生个数
        int max = 0;
        // 遍历矩阵
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j].equals("M")) {
                    for (int[] arr : direction) {
                        int reverseI = i - arr[0];
                        int reverseJ = j - arr[1];

                        // 如果前一个是M,表示此M已经计算过了,直接跳过
                        if (reverseI >= 0 && reverseI < m && reverseJ >= 0 && reverseJ < n && matrix[reverseI][reverseJ].equals("M")) {
                            continue;
                        }

                        int nextI = i + arr[0];
                        int nextJ = j + arr[1];
                        int same = 1;

                        // 计算每行、每列、斜线、反斜线相连的男生个数,并取相连最大值
                        while (nextI >= 0 && nextI < m && nextJ >= 0 && nextJ < n && matrix[nextI][nextJ].equals("M")) {
                            same++;
                            nextI += arr[0];
                            nextJ += arr[1];
                        }

                        max = Integer.max(max, same);
                    }
                }
            }
        }
        System.out.println(max);
    }
}

六、效果展示

1、输入

7,8
F,M,M,F,M,M,M,M
F,M,M,M,F,F,F,F
F,F,F,M,M,F,F,F
F,F,F,M,M,M,F,F
F,F,F,F,F,M,F,F
F,F,F,M,F,M,F,F
F,F,F,M,F,M,F,M

2、输出

5

3、说明

在这里插入图片描述


🏆下一篇:华为OD机试 - 最长的顺子 - 感谢@禁止你发言提供的更简便算法(Java 2023 B卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1334524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Midjourney】登录和使用:详细指南!

关于Midjourney 链接: Midjourney Midjourney 是一项使用人工智能自动生成图像的服务。你可以通过向人工智能发出称为“提示”的指令来生成你想要的图像。例如&#xff0c;可以生成风景、人物、建筑等各种图像&#xff0c;还可以调整图像风格&#xff08;绘画、插画风格、摄影风…

Certum的EV增强型证书

EV增强型https证书是一种特别的数字证书&#xff0c;只有这一款域名数字证书可以直接在地址栏显示企业名称(支持中文名称)。因此&#xff0c;很多企业为了提升企业的品牌形象&#xff0c;向客户展示企业的专业性和可靠性&#xff0c;往往会选择这种类型的数字证书。今天就随SSL…

基于深度学习的安全帽检测识别系统(含UI界面、yolov5、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov5 yolov5主要包含以下几种创新&#xff1a;         1. 添加注意力机制&#xff08;SE、CBAM、CA等&#xff09;         2. 修改可变形卷积&#xff08;DySnake-主…

acwing linux docker教程

终章 听着名字还挺伤感的哈哈哈其实是Linux的终章&#xff0c;感谢大家这段时间的阅读&#xff0c;这段使时间我为了给大家清楚的讲解一下Linux自己也是很认真的学习了一遍&#xff0c;自己提升了也不少。其实最近学校里面是讲了Linux和windows server 2019搭载DNS、web、ftp服…

【代码随想录】刷题笔记Day37

前言 试一试早上晚上固定时间刷题会不会效率and养成习惯 135. 分发糖果 - 力扣&#xff08;LeetCode&#xff09; 两边一起判断容易顾此失彼从左到右遍历&#xff0c;只比较右比左大的情况&#xff0c;局部and全局&#xff1a;右比左大从右到左遍历&#xff0c;只比较左比右…

【已解决】使用fastjson返回给echarts的时候怎么不忽略null值?

问题复现&#xff1a; 在使用fastjson的将对象序列化成json字符串的时候&#xff0c;如果对象属性为null的话&#xff0c;会被忽略掉的。有时候&#xff0c;这些null值还是很有用的。比如我们在使用echarts的时候&#xff0c;返回给前端就不能因为null而忽略&#xff0c;如果忽…

【echarts大屏】横向柱状图翻页轮询,让数据动起来!

想要打造震撼人心的数据可视化大屏&#xff1f;那么不妨尝试一下【echarts大屏】横向柱状图翻页轮询效果&#xff01;通过这种方式&#xff0c;可以让你的数据图表生动起来&#xff0c;吸引用户的注意力。 ✨ 接下来&#xff0c;我将为你介绍如何实现【echarts大屏】横向柱状图…

对属于国家秘密的地理信息的获取、持有、提供、利用情况进行登记并长期保存,实行可追溯管理

对属于国家秘密的地理信息的获取、持有、提供、利用情况进行登记并长期保存&#xff0c;实行可追溯管理 数据记录&#xff08;包括获取、持有、提供、利用、销毁等全闭环&#xff09;

云安全资源管理定义以及实现方法

随着云计算的大力发展&#xff0c;越来越多的企业上云了。但很多企业上云之后&#xff0c;不知道怎么保障云资源安全&#xff0c;不知道怎么管理云资源&#xff0c;今天我们就来聊聊云安全资源管理定义以及实现方法。仅供参考哈&#xff01; 云安全资源管理定义 云安全资源管理…

npm的常用使用技巧

npm是一个强大的工具&#xff0c;可以帮助你管理Node.js项目中的依赖项。以下是一些有用的npm使用技巧&#xff1a; 使用npm install命令&#xff1a;这个命令可以安装项目的依赖项。如果你想安装一个特定的版本&#xff0c;你可以使用npm install <package><version…

Linux6.2、IO基础(文件系统接口)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 直接使用系统接口 fopen底层封装的系统接口为open pathname也就是文件路径&#xff0c;flags我们通过一个demo来理解。 首先我们应该了解的是位图&#xff0c;int有32个比特位&#xff0c;我们根据他的比特位是否为1来决定这…

【数据结构】字符串匹配|BF算法|KMP算法|next数组的优化

字符串匹配算法是在实际工程中经常遇到的问题&#xff0c;也是各大公司笔试面试的常考题目&#xff0c;本文主要介绍BF算法&#xff08;最好想到的算法&#xff0c;也最好实现&#xff09;和KMP算法&#xff08;最经典的&#xff09; 一、BF算法 BF算法&#xff0c;即暴力(Bru…

轻松管理固定资产,易点易动固定资产管理系统为企业开启新篇章

在现代企业运营中&#xff0c;固定资产管理是一个不可忽视的关键环节。有效地管理和维护固定资产不仅可以提升企业运营效率&#xff0c;还能最大限度地发挥资产的价值。为了满足企业对固定资产管理的需求&#xff0c;我们推出了易点易动固定资产管理系统&#xff0c;一款功能强…

网站使用https认证

随着网络的普及和依赖程度的增加&#xff0c;网站安全性问题也日益凸显。为了确保用户和网站之间的数据传输安全&#xff0c;采用HTTPS认证已经变得至关重要。 1.数据安全是首要任务 在互联网上&#xff0c;信息传输是网站运作的基础。然而&#xff0c;未加密的传输容易受到中…

嵌入式-stm32-用PWM点亮LED实现呼吸灯

一&#xff1a;知识前置 1.1、LED灯怎么才能亮&#xff1f; 答&#xff1a;LED需要低电平才能亮&#xff0c;高电平是灯灭。 1.2、LED灯为什么可以越来越亮&#xff0c;越来越暗&#xff1f; 答&#xff1a;这是用到不同占空比来实现的&#xff0c;控制LED实现呼吸灯&…

千帆起航:探索百度智能云千帆AppBuilder在AI原生应用开发中的革新之路

千帆起航&#xff1a;探索百度千帆AppBuilder在AI原生应用开发中的革新之路 1.揭开帷幕&#xff0c;大模型第二次战役 自从 ChatGPT 横空出世后&#xff0c;一石激起千层浪&#xff0c;人工智能也正在从感知理解走向生成创造&#xff0c;这是一个关键里程碑。生成式大模型完成…

Spring Cloud + Vue前后端分离-第7章 核心业务功能开发

Spring Cloud Vue前后端分离-第7章 核心业务功能开发 7-1 课程管理功能开发 课程管理页面美化 1.课程管理页面美化 demo-course.jpg 复制search.html中的部分代码 course.vue 看效果 测试一下新增修改删除效果 1.课程管理页面美化2 scoped:style下的样式只应用于当前组件…

数字人直播系统源码开发:实现电商必备的一键生成真人直播卖货

随着互联网技术的不断演进和电子商务的蓬勃发展&#xff0c;直播电商成为了一种新兴的销售模式。然而&#xff0c;传统的直播方式存在着一些问题&#xff0c;比如主播的时间和精力有限&#xff0c;无法满足大量商品的销售需求。为了解决这个问题&#xff0c;数字人直播系统应运…

2023RT-Thread开发者大会

参加了一次RT-Thread的开发者大会&#xff0c;相当有意思&#xff0c;虽然一天奔波挺累&#xff0c;但睡了半天之后简单剪了下22号的视频&#xff0c;也就有时间写自己的参会笔记了。 与openEuler社区不同&#xff0c;RT-Thread社区更专注于嵌入式&#xff0c;与硬件厂商结合…