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

华为OD机考算法题:计算疫情扩散时间

题目部分

题目计算疫情扩散时间
难度
题目说明在一个地图中(地图由 n * n 个区域组成)有部分区域被感染病菌感染区域每天都会把周围(上下左右)的4个区域感染。
请根据给定的地图计算多少天以后,全部区域都会被感染。
如果初始地图上所有区域全部都被感染,或者没有被感染区域,返回-1。
输入描述一行 N * N 个数字(只包合 0、1,不会有其他数字)表示一个地图,数字间用分割,0 表示未感染区域,1 表示已经感染区域每 N 个数字表示地图中一行,输入数据共表示 N 行 N 列的区域地图。
例如输入1,0,1,0,0,0,1,0,1,表示地图
1,0,1
0,0,0
1,0,1
输出描述一个整数,表示经过多少天以后,全部区域都被感染。
补充说明1 <= N < 200。
------------------------------------------------------
示例
示例1
输入1,0,1,0,0,0,1,0,1
输出2
说明1 天之后,地图上仅剩中心点未被感染;2 天之后,全部被感染。
示例2
输入0,0,0,0
输出-1
说明无感染区域
示例3
输入1,1,1,1,1,1,1,1,1
输出-1
说明已经全部被感染


解读与分析

题目解读

给定一个一维数组,数组中的数字为 0、1,把它转换成对应的二维数组。如果数组的初始值全为 0 或全为 1,返回 -1。每一天,数字为 1 的会把其上下左右 4 个方向的值改成 1。求多少天后,全部都变成 1。

分析与思路

实现机制比较简单,先解析输入数据,接着统计 0 和 1 的数字,之后把 1 上下左右的数字变成 1,再统计,直到所有的数据都变成 1。具体实现步骤如下:
1. 解析数据。把输入数据解析成一维数组,记录所有包含 1 的数组下标。
2. 统计。如果 1 的个数等于所有数字个数,或 1 的个数为 0,返回 -1。否则,进行第 3 步。
3. 初始换当前感染数据。
把所有值为 1 的数字下标放到集合中,设为 value1Set。
4. 更新感染数字。遍历 value1Set,计算当天之后所有值为 1 的下标,放到集合 newValue1Set中。当前天数加1。
5. 统计 newValue1Set 的元素个数,如果等于全部个数,则全部感染,返回当前天数。否则,把 newValue1Set 赋值给 value1Set,继续执行步骤 4。

此方法的时间复杂度为 O( n平方 ),空间复杂度为 O(n)。


代码实现

Java代码

import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;/*** 计算疫情扩散时间* * @since 2023.11.01* @version 0.1* @author Frank**/
public class DiseaseSpread {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String input = sc.nextLine();String[] inputArr = input.split(",");int arrCount = inputArr.length;Set<Integer> diseaseSet = new HashSet<Integer>();for (int i = 0; i < arrCount; i++) {int value = Integer.parseInt(inputArr[i]);if (value == 1) {diseaseSet.add(i);}}processDiseaseSpread(arrCount, diseaseSet);}}private static void processDiseaseSpread(int arrCount, Set<Integer> diseaseSet) {if (diseaseSet.size() == 0 || diseaseSet.size() == arrCount) {System.out.println(-1);return;}int days = 0;// 避免误差,使用 Math.round。int dimension = (int) Math.round(Math.sqrt(arrCount));Set<Integer> newDiseaseSet = new HashSet<Integer>();newDiseaseSet.addAll(diseaseSet);while (diseaseSet.size() != arrCount) {for (Iterator<Integer> iter = diseaseSet.iterator(); iter.hasNext();) {int coords = iter.next();updateNewCoords(dimension, coords, newDiseaseSet);}days++;if (newDiseaseSet.size() == arrCount) {System.out.println(days);return;}diseaseSet = newDiseaseSet;}}private static void updateNewCoords(int dimension, int coords, Set<Integer> newDiseaseSet) {int i = coords / dimension;int j = coords % dimension;int[][] fourDirections = { { i, j - 1 }, { i, j + 1 }, { i - 1, j }, { i + 1, j } };for (int k = 0; k < fourDirections.length; k++) {int curI = fourDirections[k][0];int curJ = fourDirections[k][1];if (curI < 0 || curJ < 0 || curI >= dimension || curJ >= dimension) {continue;}Integer curCoords = curI * dimension + curJ;if (!newDiseaseSet.contains(curCoords)) {newDiseaseSet.add(curCoords);}}}}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {while (line = await readline()) {var inputArr = line.split(",");var arrCount = inputArr.length;var diseaseSet = new Set();for (var i = 0; i < arrCount; i++) {var value = parseInt(inputArr[i]);if (value == 1) {diseaseSet.add(i);}}processDiseaseSpread(arrCount, diseaseSet);}
}();function processDiseaseSpread(arrCount, diseaseSet) {if (diseaseSet.size == 0 || diseaseSet.size == arrCount) {console.log(-1);return;}var days = 0;// 避免误差,使用 Math.round。var dimension = Math.round(Math.sqrt(arrCount));while (diseaseSet.size != arrCount) {var newDiseaseSet = new Set();for (var i of diseaseSet) {newDiseaseSet.add(i);updateNewCoords(dimension, i, newDiseaseSet);}days++;if (newDiseaseSet.size == arrCount) {console.log(days);return;}diseaseSet = newDiseaseSet;}
}function updateNewCoords(dimension, coords, newDiseaseSet) {var i = parseInt(coords / dimension);var j = coords % dimension;var fourDirections = [[i, j - 1],[i, j + 1],[i - 1, j],[i + 1, j]];for (var k = 0; k < fourDirections.length; k++) {var curI = fourDirections[k][0];var curJ = fourDirections[k][1];if (curI < 0 || curJ < 0 || curI >= dimension || curJ >= dimension) {continue;}var curCoords = curI * dimension + curJ;if (!newDiseaseSet.has(curCoords)) {newDiseaseSet.add(curCoords);}}}

(完)

相关文章:

华为OD机考算法题:计算疫情扩散时间

题目部分 题目计算疫情扩散时间难度难题目说明在一个地图中(地图由 n * n 个区域组成)有部分区域被感染病菌感染区域每天都会把周围(上下左右)的4个区域感染。 请根据给定的地图计算多少天以后&#xff0c;全部区域都会被感染。 如果初始地图上所有区域全部都被感染&#xff0…...

29岁从事功能测试5年被辞,面试4个月还没到工作......

最近一个32岁的老同学因为被公司辞退&#xff0c;聊天过程中找我倾诉&#xff0c;所以写下了这篇文章。 他是15年二本毕业&#xff0c;学的园林专业&#xff0c;人属于比较懒的那种&#xff0c;不爱学习&#xff0c;专业学的也一般。实习期间通过校招找到了一份对口的工作。但…...

再记【fatal error C1001: 内部编译器错误】的一个原因

平台&#xff1a;Windows 11、Visual Studio 2022 报错信息 已启动生成... 1>------ 已启动生成: 项目: PointMatchingModel, 配置: Debug x64 ------ 1>PointMatchingModel.cpp 1>C:\tools\vcpkg\installed\x64-windows\include\pcl\registration\impl\ia_fpcs.hpp…...

数据分析、大数据分析和人工智能之间的区别

数据分析、大数据分析和人工智能近年来十分热门&#xff0c;三者之间看起来有相似之处&#xff0c;也有不同之处。今天就来谈谈三者间的区别。 数据分析 数据分析是指对数据进行分析&#xff0c;从中提取有价值的信息&#xff0c;以支持企业或组织的决策制定。数据分析可以针对…...

Spring系列之基础

目录 Spring概述 Spring的优点 Spring Framework的组成 总结 Spring概述 Spring 是目前主流的 Java Web 开发框架&#xff0c;是 Java 世界最为成功的框架。该框架是一个轻量级的开源框架&#xff0c;具有很高的凝聚力和吸引力。它以Ioc&#xff08;控制反转&#xff09;和…...

Android开发知识学习——TCP / IP 协议族

文章目录 学习资源来自&#xff1a;扔物线TCP / IP 协议族TCP连接TCP 连接的建立与关闭TCP 连接的建立为什么要三次握手&#xff1f; TCP 连接的关闭为什么要四次挥手&#xff1f; 为什么要⻓连接&#xff1f; 常见面试题课后题 学习资源来自&#xff1a;扔物线 TCP / IP 协议…...

思维训练 第四课 省略句

系列文章目录 文章目录 系列文章目录前言一、省略的十五种情况1.并列复合句中某些相同成分的省略2.在用when, while, if, as if, though, although, as ,until, whether等连词引导的状语从句中&#xff0c;如果谓语有be,而主语又跟主句的主语相同或是&#xff08;从句主语是&am…...

soul协议算法

逆向工程技术是指对软件或应用程序进行逆向分析以了解其内部机制和功能的过程。虽然我无法详细介绍"Soul App"的逆向工程技术&#xff0c;但以下是一些常见的逆向工程技术&#xff0c;可能与你的研究相关&#xff1a; 1. 反汇编&#xff08;Disassembly&#xff09;…...

电子产品的认证体系

一、国内认证体系 1、CNAS认可&#xff1a;对认证机构的认可 CNAS全称是China National Accreditation Service for Conformity Assessment&#xff0c;中国合格评定国家认可委员会&#xff0c;由国家认证认可监督管理委员会&#xff08;CNCA&#xff09;批准设立并授权的唯一…...

大厂面试题-网络四元组

四元组&#xff0c;简单理解就是在TCP协议中&#xff0c;去确定一个客户端连接的组成要素&#xff0c;它包括源 IP地址、目标IP地址、源端口号、目标端口号。 正常情况下&#xff0c;我们对于网络通信的认识可能是这样(如图)。 服务端通过Server Socket建立一个对指定端口号…...

【通义千问“助力用户运营,无代码开发实现API连接广告推广和CRM】

通义千问&#xff1a;阿里云推出的超大规模语言模型 通义千问&#xff0c;是阿里云推出的一个超大规模的语言模型&#xff0c;功能包括多轮对话、文案创作、逻辑推理、多模态理解、多语言支持。这款产品的主要目标是帮助用户在无需编程的情况下&#xff0c;通过API连接广告推广…...

数据结构第一课-----------数据结构的介绍

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

Python武器库开发-常用模块之OS模块(十一)

常用模块之OS模块(十一) Python中的 os 模块提供了非常丰富的方法用来处理文件和目录&#xff0c;可以执行一些操作系统的功能。常用的方法如下表所示&#xff1a; 序号方法描述1os.access(path, mode)检验权限模式2os.chdir(path)改变当前工作目录3os.chflags(path, flags)设…...

Vectrosity 插件使用

1 下载 https://download.csdn.net/download/moonlightpeng/88490704?spm1001.2014.3001.5503 2 使用&#xff0c;目前在2020.3.3上测试可以 导入时选5.6 再导入demo...

数据结构详细笔记——并查集

文章目录 逻辑结构存储结构并、查代码实现Union 操作的优化Find 操作的优化&#xff08;压缩路径&#xff09; 逻辑结构 集合&#xff1a;将各个元素划分为若干个互不相交的子集的集合 森林是m(m>0)棵互不相交的树的集合 存储结构 #define SIZE 13 int UFSets[SIZE]; …...

transformers-Generation with LLMs

https://huggingface.co/docs/transformers/main/en/llm_tutorialhttps://huggingface.co/docs/transformers/main/en/llm_tutorial停止条件是由模型决定的&#xff0c;模型应该能够学习何时输出一个序列结束&#xff08;EOS&#xff09;标记。如果不是这种情况&#xff0c;则在…...

maven之父子工程版本控制案例实战,及拓展groupId和artifactId的含义

<parent>标签 用于父子工程项目&#xff0c;什么是父子工程&#xff1f; 顾名思义&#xff0c;maven父子项目是一个有一个父项目&#xff0c;父项目下面又有很多子项目的maven工程&#xff0c;当然&#xff0c;子项目下面还可以添加子项目&#xff0c;从而形成一个树形…...

100量子比特启动实用化算力标准!玻色量子重磅发布相干光量子计算机

2023年5月16日&#xff0c;北京玻色量子科技有限公司&#xff08;以下简称“玻色量子”&#xff09;在北京正大中心成功召开了2023年首场新品发布会&#xff0c;重磅发布了自研100量子比特相干光量子计算机——“天工量子大脑”。 就在3个月前&#xff0c;因“天工量子大脑”在…...

JAVA基础(JAVA SE)学习笔记(十)多线程

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第三阶段&#xff1a;Java高级应用 9.异常处理 10.多线程 11.常用类和基础API 12.集合框架 13.泛型 14…...

ChatGPT参数只有200亿?扩散代码模型,意外泄露

微软的研究部门发布了一篇关于预训练扩散代码模型CodeFusion的论文。在展示代码生成任务的基线数据对比时&#xff0c;发现了一个有趣的事情&#xff0c;ChatGPT&#xff08;gpt-3.5-turbo&#xff09;的参数只有200亿。 要知道&#xff0c;gpt-3.5-turbo是OpenAI中应用最多、…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...