华为OD机试C卷“分土地”Java解答

2024-03-14 08:12
文章标签 java 华为 解答 土地 od 机试

本文主要是介绍华为OD机试C卷“分土地”Java解答,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。某天集体村民决定将覆盖相同数字的最小矩阵形的土地的分配给为村里做出巨大责献的村民,请同,此次分配土地,做出贡献的村民中最大会分配多大面积?

输入描述

第一行开始给人地国上的具体标识行输入m和n,m代表村子的土地的长,n代表士地的宽

输出描述

输出需要分配的土地面积,即包含相同数字旗子的最小矩阵中的最大面积。

补充说明

旗子上的数字为1-500,土地边长不超过500未插旗子的土地用0标识

示例

示例1

输入

3 3

1 0 1

0 0 0

0 1 0

输出

9

说明

十地上的旗子为1,其坐标分别为(0,0),(2,1)以及(0,2),为了覆盖所有旗子,矩阵需要覆盖的横坐标为0和2,纵坐标为0和2,所以面积为9,即(2-0+1)*(2-0+1)=9。

示例2

输入

3 3

1 0 2

0 0 0

0 3 4

输出

1

说明

由于不存在成对的小旗子,故而返回1,即一块土地的面积

算法思路1

  1. 首先从输入中读取村庄的长和宽(m 和 n)以及地图上每个位置的数字,数字表示在该位置上插有旗子。

  2. 创建一个 HashMap 对象(tudi),用于存储相同数字的坐标信息。键是数字,值是一个包含四个整数的数组,表示覆盖相同数字的最小矩形区域的左上角和右下角的坐标。

  3. 遍历地图上的每个位置,对于每个非零数字:

    • 如果当前数字在 HashMap 中不存在,将其作为键,创建一个数组并将该位置的坐标存入数组,然后将数组放入 HashMap。
    • 如果当前数字在 HashMap 中已经存在,调用 changePoint 方法更新该数字对应的坐标信息。changePoint 方法会根据当前位置更新覆盖相同数字的矩形区域的左上角和右下角的坐标。
  4. 遍历完地图上的所有位置后,计算覆盖相同数字的最大矩形区域的面积:

    • 遍历 HashMap 中存储的所有坐标信息,对每个数字的坐标信息进行计算,得到相应的矩形区域的长和宽,并计算面积。
    • 在遍历过程中,不断更新最大面积。
  5. 打印输出覆盖相同数字的最大矩形区域的面积。

整体思路是通过遍历地图,将相同数字的位置信息存储起来,然后计算每个数字对应的矩形区域的面积,最后找到覆盖相同数字的最大矩形区域的面积。

答案1

import java.util.Scanner;
import java.util.HashMap;public class TudiAreaCalculator {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int m = scanner.nextInt();int n = scanner.nextInt();scanner.nextLine(); // Consume the newline characterHashMap<Integer, int[]> tudi = new HashMap<>();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {int val = scanner.nextInt();if (val == 0) continue;if (!tudi.containsKey(val)) {tudi.put(val, new int[]{j, i, j, i});} else {changePoint(j, i, tudi.get(val));}}if (scanner.hasNextLine()) {scanner.nextLine(); // To move to the next line after reading all values in a row}}int maxArea = 1;for (int[] value : tudi.values()) {maxArea = Math.max(maxArea, (value[2] - value[0] + 1) * (value[3] - value[1] + 1));}System.out.println(maxArea);scanner.close();}private static void changePoint(int x, int y, int[] point) {point[0] = Math.min(point[0], x);point[1] = Math.min(point[1], y);point[2] = Math.max(point[2], x);point[3] = Math.max(point[3], y);}
}

详解1

  1. import java.util.Scanner;import java.util.HashMap;:这两行是导入所需的Java类,Scanner类用于从标准输入读取数据,HashMap类用于存储相同数字的坐标信息。

  2. public class TudiAreaCalculator { ... }:这是定义了一个名为TudiAreaCalculator的Java类。

  3. public static void main(String[] args) { ... }:这是主方法,程序的入口点,从这里开始执行。

  4. Scanner scanner = new Scanner(System.in);:创建了一个Scanner对象,用于从标准输入(键盘)读取数据。

  5. int m = scanner.nextInt();int n = scanner.nextInt();:从输入中读取两个整数,分别代表村子的土地的长和宽。

  6. scanner.nextLine();:读取并消耗掉输入流中的换行符,以便后续读取。

  7. HashMap<Integer, int[]> tudi = new HashMap<>();:创建了一个HashMap对象,用于存储相同数字的坐标信息。键是数字,值是一个包含四个整数的数组,表示覆盖相同数字的最小矩形区域的左上角和右下角的坐标。

  8. for (int i = 0; i < m; i++) { ... }:外层循环遍历输入的行数,内层循环遍历每一行的列数。

  9. int val = scanner.nextInt();:读取输入的每个数字。

  10. if (val == 0) continue;:如果当前读取的数字为0,则跳过后续处理,因为题目要求忽略数字为0的土地。

  11. if (!tudi.containsKey(val)) { ... } else { ... }:检查当前读取的数字是否已经存在于HashMap中。如果不存在,则将其作为键,创建一个数组并放入HashMap;如果已经存在,则调用changePoint方法更新该数字对应的坐标信息。

  12. if (scanner.hasNextLine()) { scanner.nextLine(); }:在每行读取完毕后,检查是否还有下一行,如果有则继续读取,以便移动到下一行。

  13. int maxArea = 1;:初始化变量maxArea为1,用于存储覆盖相同数字的最大矩形区域的面积。

  14. for (int[] value : tudi.values()) { ... }:遍历HashMap中存储的所有坐标信息,计算每个数字对应的矩形区域的面积,并更新maxArea的值。

  15. System.out.println(maxArea);:打印输出覆盖相同数字的最大矩形区域的面积。

  16. scanner.close();:关闭Scanner对象,释放资源。

  17. private static void changePoint(int x, int y, int[] point) { ... }:定义了一个私有静态方法changePoint,用于更新数字对应的矩形区域的坐标信息。

有关HashMap的使用,详见Java“集合框架”知识速成笔记学完就去实战(三)-CSDN博客

这篇关于华为OD机试C卷“分土地”Java解答的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/807762

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定