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

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
      • 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];// 跳过女生Mif (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.mzph.cn/news/576806.shtml

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

相关文章

浏览器加粗字体显示异常

浏览器加粗的字体模糊虚化 如果在css中设置了普通的字体样式 font-face&#xff0c;使用了 font-weight: bold 的字体会在浏览器页面中会显示模糊虚化的现象&#xff0c;而正常的字体没有这种情况&#xff0c;显示的情况根据不同的浏览器会有区别。 * 出现轻微模糊虚化效果&am…

设计模式--桥接模式

实验9&#xff1a;桥接模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解桥接模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用桥接模式解决实际问题。 [实验任务]&#xff1a;两个维度的桥接模式 用桥接模式…

什么是OAuth2.0

前言 OAuth&#xff08;Open Authorization&#xff09;是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三方移动应用或分享他们数…

ssh远程执行命令卡住 使用vim、vi、cat等命令,或者在执行shell脚本时,都会莫名的卡住

最大传输单元 (MTU) 是网络层协议&#xff08;如 TCP&#xff09;支持的最大数据包的大小&#xff08;以字节为单位&#xff09;&#xff0c;标头和数据均包括在内。 通过IPsec隧道发送的网络数据包经过加密&#xff0c;然后封装在外部数据包中&#xff0c;以便进行路由。因为…

WiFi通信协议

一、引言 随着无线通信技术的飞速发展&#xff0c;WiFi协议已经成为现代生活中不可或缺的一部分。WiFi协议&#xff0c;全称为无线保真技术&#xff0c;是一种允许电子设备通过无线方式连接到互联网的技术标准。本文将深入探讨WiFi协议通信的工作原理、特点以及应用场景。 二、…

Netty组件基础

Netty入门简介 netty是一个异步、基于事件驱动的网络应用框架&#xff0c;用于快速开发可维护、高性能的网络服务器和客户端。 Netty优势 Netty解决了TCP传输问题&#xff0c;如黏包、半包问题&#xff0c;解决了epoll空轮询导致CPU100%的问题。并且Netty对API进行增强&#xf…

taro小程序指定@代表

1.ts.config.json "paths": {"/*": ["./src/*"] } config/index.js const path require(path) alias: {: path.resolve(__dirname, .., src) },

Codeforces Round 917 (Div. 2)(A~D)

A - Least Product Solution 观察发现&#xff0c;对于 a i < 0 a_i<0 ai​<0&#xff0c;操作后 a i a_i ai​ 不会变得更小&#xff0c; a i > 0 a_i>0 ai​>0&#xff0c;操作后 a i a_i ai​ 不会变得更大。所以&#xff0c;当 ∏ i 1 n a i ≥ 0…

Python如何将图片转换成字符

PIL(Python Image Library)库是Python平台上一个功能强大的图像处理标准库&#xff0c;支持图像的存储、显示和处理&#xff0c;几乎可以处理所有图片格式&#xff0c;如图像的压缩、裁剪、叠加、添加文字等等。 安装PIL库:pip install pillow from PIL import Image ascii_cha…

【期末复习】微信小程序复习大纲( 1- 5 章)

前言&#xff1a; 这周开始进入期末复习周&#xff0c;没时间看C/C、linux等知识了&#xff0c;先把期末考试必考的知识捋一遍。 目录 第一章 微信小程序入门 一、填空题 二、判断题 三、选择题 四、简答题 第二章 微信小程序页面制作 一、填空题 二、判…

【Java中创建对象的方式有哪些?】

✅Java中创建对象的方式有哪些&#xff1f; ✅使用New关键字✅使用反射机制✅使用clone方法✅使用反序列化✅使用方法句柄✅ 使用Unsafe分配内存 ✅使用New关键字 这是我们最常见的也是最简单的创建对象的方式&#xff0c;通过这种方式我们还可以调用任意的构造函数 (无参的和有…

mybatis的二级缓存使用以及禁用

目录 mybatis 二级缓存配置有两处 全局设置 mapper 设置 测试代码 执行结果 源码执行逻辑 创建 SqlSession 二级缓存配置是否添加 解析 cache 标签 XMLMapperBuilder MapperBuilderAssistant CacheBuilder PerpetualCache SerializedCache LoggingCache 将 cach…

Grafana二进制部署并配置prometheus数据源

1、获取grafna二进制安装包 https://grafana.com/grafana/download?pggraf&plcmtdeploy-box-1 grafana官网下载地址 [rootambari-hadoop1 ~]# cd /opt/module/grafana/ [rootambari-hadoop1 grafana]# pwd /opt/module/grafana2、在安装自己的安装目录执行 wget https:…

【C Primer Plus第六版 学习笔记】第十三章 文件输入/输出

有基础&#xff0c;进阶用&#xff0c;个人查漏补缺 文件&#xff1a;在磁盘或固态硬盘上的一段已命名的存储区。C把文件看作是一系列连续的字节所有文件的内容都以二进制形式&#xff08;0或1&#xff09;储存。 文本文件&#xff1a;文件最初使用二进制编码的字符表示文本&a…

在killercoda中的一次apiserver异常追查思路

笔者&#xff1a; 最近在准备cks考试&#xff0c; 然后又发现了killercoda这个能够提供模拟考试环境的平台。它提供了很棒的引导&#xff0c;教你一步步追查问题&#xff0c;形成一整套追查思路&#xff0c;我觉得很不错&#xff0c;特此分享。 准备工作 首先还是需要养成配置…

spark:RDD编程(Python版)

RDD运行原理 RDD设计背景 许多选代目前的MapReduce框架都是把中间结果写入到稳定存储 (比如磁盘)中带来了大量的数据复制、磁盘IO和序列化开销 RDD就是为了满足这种需求而出现的&#xff0c;它提供了一个抽象的数据架构&#xff0c;我们不必担心底层数据的分布式特性&#xf…

useRef语法讲解

useRef useRef 用法 import { useRef, useState } from react import ./App.cssfunction App() {const userRef useRef<HTMLInputElement>(null)const [val, setVal] useState()const handleClick () > {userRef.current?.focus()setVal(userRef.current?.valu…

windows中python3创建虚拟环境

当我们在创建一个python项目时&#xff0c;经常需要安装一堆库&#xff0c;然后转到另一个项目&#xff0c;却发现依赖冲突了&#xff0c;人都麻了。所以创建虚拟环境就是解决这个大麻烦的。 什么是虚拟环境&#xff1f; 虚拟环境是Python的一个工具&#xff0c;支持我们在一…

【cesium-2】Cesium相机系统

相机系统有setView、flyTo、lookAt、viewBoundingsphere等方法&#xff0c;下面是相关的使用方法。 flyTo具有空中飞行逐步切换视域的效果&#xff0c;还可设置飞行时间&#xff1b; setView方法可直接切换相机视口&#xff0c;从而不需要通过一个飞入的效果切换&#xff1b; l…

C/C++不同整数类型的区别

在C/C中涉及的整数相关的类型大致有如下几种&#xff1a; char、unsigned charshort、unsigned shortint、unsigned intlong、unsigned longlong long、unsigned long longint8_t、uint8_tint32_t、uint32_tint64_t、uint64_tDWORDDWORD32、DWORD64size_t、ssize_tSIZE_T、SSI…