华为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个区域感染。 请根据给定的地图计算多少天以后,全部区域都会被感染。 如果初始地图上所有区域全部都被感染࿰…...
29岁从事功能测试5年被辞,面试4个月还没到工作......
最近一个32岁的老同学因为被公司辞退,聊天过程中找我倾诉,所以写下了这篇文章。 他是15年二本毕业,学的园林专业,人属于比较懒的那种,不爱学习,专业学的也一般。实习期间通过校招找到了一份对口的工作。但…...
再记【fatal error C1001: 内部编译器错误】的一个原因
平台: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…...
数据分析、大数据分析和人工智能之间的区别
数据分析、大数据分析和人工智能近年来十分热门,三者之间看起来有相似之处,也有不同之处。今天就来谈谈三者间的区别。 数据分析 数据分析是指对数据进行分析,从中提取有价值的信息,以支持企业或组织的决策制定。数据分析可以针对…...
Spring系列之基础
目录 Spring概述 Spring的优点 Spring Framework的组成 总结 Spring概述 Spring 是目前主流的 Java Web 开发框架,是 Java 世界最为成功的框架。该框架是一个轻量级的开源框架,具有很高的凝聚力和吸引力。它以Ioc(控制反转)和…...
Android开发知识学习——TCP / IP 协议族
文章目录 学习资源来自:扔物线TCP / IP 协议族TCP连接TCP 连接的建立与关闭TCP 连接的建立为什么要三次握手? TCP 连接的关闭为什么要四次挥手? 为什么要⻓连接? 常见面试题课后题 学习资源来自:扔物线 TCP / IP 协议…...
思维训练 第四课 省略句
系列文章目录 文章目录 系列文章目录前言一、省略的十五种情况1.并列复合句中某些相同成分的省略2.在用when, while, if, as if, though, although, as ,until, whether等连词引导的状语从句中,如果谓语有be,而主语又跟主句的主语相同或是(从句主语是&am…...
soul协议算法
逆向工程技术是指对软件或应用程序进行逆向分析以了解其内部机制和功能的过程。虽然我无法详细介绍"Soul App"的逆向工程技术,但以下是一些常见的逆向工程技术,可能与你的研究相关: 1. 反汇编(Disassembly)…...
电子产品的认证体系
一、国内认证体系 1、CNAS认可:对认证机构的认可 CNAS全称是China National Accreditation Service for Conformity Assessment,中国合格评定国家认可委员会,由国家认证认可监督管理委员会(CNCA)批准设立并授权的唯一…...
大厂面试题-网络四元组
四元组,简单理解就是在TCP协议中,去确定一个客户端连接的组成要素,它包括源 IP地址、目标IP地址、源端口号、目标端口号。 正常情况下,我们对于网络通信的认识可能是这样(如图)。 服务端通过Server Socket建立一个对指定端口号…...
【通义千问“助力用户运营,无代码开发实现API连接广告推广和CRM】
通义千问:阿里云推出的超大规模语言模型 通义千问,是阿里云推出的一个超大规模的语言模型,功能包括多轮对话、文案创作、逻辑推理、多模态理解、多语言支持。这款产品的主要目标是帮助用户在无需编程的情况下,通过API连接广告推广…...
数据结构第一课-----------数据结构的介绍
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
Python武器库开发-常用模块之OS模块(十一)
常用模块之OS模块(十一) Python中的 os 模块提供了非常丰富的方法用来处理文件和目录,可以执行一些操作系统的功能。常用的方法如下表所示: 序号方法描述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 使用,目前在2020.3.3上测试可以 导入时选5.6 再导入demo...
数据结构详细笔记——并查集
文章目录 逻辑结构存储结构并、查代码实现Union 操作的优化Find 操作的优化(压缩路径) 逻辑结构 集合:将各个元素划分为若干个互不相交的子集的集合 森林是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停止条件是由模型决定的,模型应该能够学习何时输出一个序列结束(EOS)标记。如果不是这种情况,则在…...
maven之父子工程版本控制案例实战,及拓展groupId和artifactId的含义
<parent>标签 用于父子工程项目,什么是父子工程? 顾名思义,maven父子项目是一个有一个父项目,父项目下面又有很多子项目的maven工程,当然,子项目下面还可以添加子项目,从而形成一个树形…...
100量子比特启动实用化算力标准!玻色量子重磅发布相干光量子计算机
2023年5月16日,北京玻色量子科技有限公司(以下简称“玻色量子”)在北京正大中心成功召开了2023年首场新品发布会,重磅发布了自研100量子比特相干光量子计算机——“天工量子大脑”。 就在3个月前,因“天工量子大脑”在…...
JAVA基础(JAVA SE)学习笔记(十)多线程
前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第三阶段:Java高级应用 9.异常处理 10.多线程 11.常用类和基础API 12.集合框架 13.泛型 14…...
ChatGPT参数只有200亿?扩散代码模型,意外泄露
微软的研究部门发布了一篇关于预训练扩散代码模型CodeFusion的论文。在展示代码生成任务的基线数据对比时,发现了一个有趣的事情,ChatGPT(gpt-3.5-turbo)的参数只有200亿。 要知道,gpt-3.5-turbo是OpenAI中应用最多、…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
