华为OD算法题汇总

60、计算网络信号

题目

网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。注意:网络信号可以绕过阻隔物
array[m][n],二维数组代表网格地图
array[i][j]=0,代表i行j列是空旷位置
array[i][j]= x,(x为正整数)代表i行j列是信号源,信号强度是x,
array[i][j]=-1, 代表i行j列是阻隔物
信号源只有1个,阻隔物可能有0个或多个;
网络信号袁减是上下左右相邻的网格衰减1现要求输出对应位置的网络信号值。

输入
输入为三行,
第一行为 m、n,代表输入是一个mxn 的数组,
第二行是一串 mxn 如个用空格分隔的整数每连续n个数代表一行,再往后n个代表下一行,以此类推。对应的值代表对应的网格是空矿位置,还是信号源,还是阻隔物,
第三行是ì、j,代表需要计算 array[i][j] 的网络信号值。注意:此处i和j均从 0开始,即第一行i为0;

例如:

6 5
0 0 0 -1 0 0 0 0 0 0 0 0 -1 4 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0
1 4

输出
输出对应位置的网络信号值,如果网络信号未覆盖到,也输出0。
一个网格如果可以途径不同的传播衰减路径传达,取较大的值作为其信号值。

解题思路

把信号源向上下左右四个方向扩散,并把满足条件的扩散点作为新的信号源继续扩散,直到信号值为0、或者扩散到“坐标系”边缘

6 5
0 0 0 -1 0 0 0 0 0 0 0 0 -1 4 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0

对于以上输入,得到的二维数组(可视为坐标系)为

0 0  0 -1  0 
0 0  0  0  0 
0 0 -1  4  0 
0 0  0  0  0 
0 0  0  0 -1 
0 0  0  0  0

扩散后,最终为

0 0  1 -1  1 
0 1  2  3  2 
0 0 -1  4  3 
0 1  2  3  2 
0 0  1  2 -1 
0 0  0  1  0

这里一定要注意,二维数组和我们上学时常用的xy轴坐标系还是有区别的,它们的原点不同,下面简化一下以上二维数组坐标系示意图

在这里插入图片描述

6 5
0 0 0 -1 0 0 0 0 0 0 0 0 -1 4 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0
1 4

这个输入,要求的输出array[1][4],它的结果是2;
我一开始把二维数组和上学时的xy轴坐标系给搞混了,死活想不明白(1,4)为啥是2,而不是1?

java代码

没有作输入的合法性校验,有兴趣的可以自己补充一下;
变量名起的也比较随意,大家不要学我

import java.util.LinkedList;
import java.util.Scanner;public class A60计算网络信号 {private static LinkedList<Danyuange> list = new LinkedList<>();private static int[][] zhouweiArr = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};public static void main(String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt();int n = sc.nextInt();int[][] inputArr = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {int d = sc.nextInt();inputArr[i][j] = d;if(d > 0) {Danyuange yuan = new Danyuange();yuan.setX(i);yuan.setY(j);yuan.setD(d);list.add(yuan);}}}int queryX = sc.nextInt();int queryY = sc.nextInt();while (list.size() > 0) {Danyuange danyuange = list.removeFirst();kuosanMethod(inputArr, danyuange);}System.out.println(inputArr[queryX][queryY]);}private static void kuosanMethod(int[][] inputArr, Danyuange danyuange) {int x = danyuange.getX();int y = danyuange.getY();int d = danyuange.getD();for (int i = 0; i < 4; i++) {int newX = x + zhouweiArr[i][0];int newY = y + zhouweiArr[i][1];if(newX >= 0 && newX < inputArr.length && newY >= 0 && newY < inputArr[0].length) {if(inputArr[newX][newY] == 0) {inputArr[newX][newY] = d - 1;}if(inputArr[newX][newY] < d && inputArr[newX][newY] >= 2 && inputArr[newX][newY] != -1) {Danyuange newDanyuange = new Danyuange();newDanyuange.setX(newX);newDanyuange.setY(newY);newDanyuange.setD(d-1);list.add(newDanyuange);}}}}private static class Danyuange {int x;int y;int d;public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getD() {return d;}public void setD(int d) {this.d = d;}}
}

61、简易内存池

题目

请实现一个简易内存池根据请求命令完成内存分配和释放内存池支持两种操作命令REQUEST和 RELEASE ;
其格式为:
REQUEST=请求的内存大小
表示请求分配指定大小内存
如果分配成功,返回分配到的内存首地址;
如果内存不足,或指定的大小为零则输出 error;
RELEASE=释放的内存首地址
表示释放掉之前分配的内存,释放成功无需输出如果,
释放不存在的首地址则输出 error

注意:
1.内存池总大小为 100 字节
2.内存池地址分配必须是连续内存,并优先从低地址分配
3.内存释放后可被再次分配,已释放的内存在空闲时不能被二次释放4.不会释放已申请的内存块的中间地址
5.释放操作只是针对首地址所对应的单个内存块进行操作,不会影响其他内存块

输入:
首行为整数 N,表示操作命令的个数取值范围 8<N<=100
接下来的N行,每行将给出一个操作命令;
操作命令和参数之间用“=”分割

输出:
见题目输出要求

示例1:

输入:
2
REQUEST=10
REQUEST=20
输出:
0
10

示例2:

输入:
6
REQUEST=10
REQUEST=20
RELEASE=0
RELEASE=20
REQUEST=20
REQUEST=10
输出:
0
10
error
30
0

解题思路

1)用二维数组收录输入,会非常便于后续操作;当然也可以用单独的数组;
2)用treemap模拟内存(必须用treemap,需要key有序);

  • RELEASE释放比较简单,包含key就remove,不包含就输出error;
  • REQUEST单独一个方法处理,会使代码逻辑很清晰;自定义变量left初始值为0,表示与下一个已用内存首地址之间、未使用内存的首地址;
	0————k1-v1————k2-v2————...————kn-vn————max
  • 如上图示意,k-left就代表空闲内存的长度,k1-0就是最前边的空闲内存,从前往后、循环测试map的所有空闲内存key-left是否大于等于新内存l;
  • ps:学会取map的key放入list的方法 List keyList = new ArrayList<>(map.keySet())
  • 如果这个长度大于等于要存入的长度l,map直接put(left, left + l),并结束方法return;
  • ps:还是为了方便,v不存真实的尾地址索引,而是直接存(索引+1),即占用内存长度是 [k, v)
  • 如果这个长度小于要存入的长度l,则left = v,继续下一个循环;
  • 当map的所有key都测试过,仍未找到可以放新内存l的地方,测试 max-left(此时left等于vn)是否大于等于l,
  • 如果大于等于,put(left, left + l)
  • 如果小于,输出error;

java代码


public class A61简易内存池 {private static Map<Integer, Integer> map = new TreeMap<>();public static void main(String[] args) {Scanner sc = new Scanner(System.in);int orderNum = Integer.parseInt(sc.nextLine());String[][] orders = new String[orderNum][];for (int i = 0; i < orderNum; i++) {orders[i] = sc.nextLine().split("=");}for (int j = 0; j < orderNum; j++) {String order = orders[j][0];int length = Integer.parseInt(orders[j][1]);if("REQUEST".equals(order)) {requestMethod(length);} else {if(map.containsKey(length)) {map.remove(length);} else {System.out.println("error");}}}}private static void requestMethod(int length) {int left = 0;if(map.size() == 0){map.put(length, left + length);//包含左、不包含右}List<Integer> keyList = new ArrayList<>(map.keySet());for (Integer key : keyList) {if(key - left >= length) {map.put(left, left + length);//包含左、不包含右System.out.println(left);return;} else {left = map.get(key);}}//循环结束,表示所有kv之间,都没有找到能放length的地方;检查剩余字节if(100 - left >= length) {map.put(left, left + length);//包含左、不包含右System.out.println(left);} else {System.out.println("error");}}
}

x

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

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

相关文章

Mamori.xyz:基于机器学习的区块链价值提取系统

Mamori.xyz 是一个基于机器学习的自动化区块链价值提取系统&#xff0c;其开创一种通用路径查找器&#xff0c;该工具可用于检测和防御潜在的未知安全风险&#xff0c;Mamori.xyz 也将其称为“未知的未知”&#xff0c;即智能合约中的零日漏洞和新出现的与区块链相关的软件问题…

leetcode-383.赎金信

题源 383.赎金信 题目描述 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。示例 1&…

Qt Creator:C++与Python混合编程

目录 1.前言 2.调用Python前的准备 3.在Qt Creator中配置Python库 4.在Qt Creator中添加Python代码 5.在Qt Creator中运行Python代码 6.运行效果 前言 在进行软件开发过程中&#xff0c;我们一般都是在特定的环境下特定的开发语言下进行编程。但是在开发中总有特殊情况&#xf…

【PHP小课堂】学习PHP中的字符串操作函数(三)

学习PHP中的字符串操作函数&#xff08;三&#xff09; 继续我们的 PHP 中字符串函数的学习之旅。今天我们要学习的内容是除了 str_ 和 str 开头之外的其它函数&#xff0c;这些函数也有很多非常好玩的内容&#xff0c;让我们赶快进入主题吧。 分隔、打断字符串 关于这个分割字…

Linux基础 -- 运行安全之ASLR的作用与实现方式

Linux ARM ASLR 的作用与实现方式 简介 ASLR&#xff08;Address Space Layout Randomization&#xff0c;地址空间布局随机化&#xff09;是一种安全技术&#xff0c;用于防止攻击者通过利用已知的内存地址来进行攻击。它通过随机化进程的内存地址空间布局&#xff0c;使得内…

docker-cli nerdctl ctr crictl容器命令比较

一、docker-cli、nerdctl 和 ctr 以及 crictl 介绍 docker, nerdctl 和 ctr 和 crictl 都是用于容器管理的命令行工具&#xff0c;但它们在设计目的、使用场景和技术栈上有所不同。下面分别对这四个工具进行介绍&#xff0c;并指出它们之间的主要差异。 1.1、Docker CLI Doc…

Ionic 安装指南

Ionic 安装指南 Ionic 是一个强大的开源框架,用于开发跨平台的移动应用程序。它结合了 Angular、React 或 Vue 的强大功能,允许开发者使用网页技术构建高性能的移动应用。本指南将详细介绍如何在不同操作系统上安装 Ionic,并开始您的第一个 Ionic 项目。 系统要求 在开始…

【CPO-TCN-BiGRU-Attention回归预测】基于冠豪猪算法CPO优化时间卷积双向门控循环单元融合注意力机制

基于冠豪猪算法CPO&#xff08;Correlation-Preservation Optimization&#xff09;优化的时间卷积双向门控循环单元&#xff08;Bidirectional Gated Recurrent Unit&#xff0c;BiGRU&#xff09;融合注意力机制&#xff08;Attention&#xff09;的回归预测需要详细的实现和…

微调 Florence-2 - 微软的尖端视觉语言模型

Florence-2 是微软于 2024 年 6 月发布的一个基础视觉语言模型。该模型极具吸引力&#xff0c;因为它尺寸很小 (0.2B 及 0.7B) 且在各种计算机视觉和视觉语言任务上表现出色。 Florence 开箱即用支持多种类型的任务&#xff0c;包括: 看图说话、目标检测、OCR 等等。虽然覆盖面…

Elasticsearch索引管理和生命周期管理

在大数据和搜索引擎技术日益成熟的今天&#xff0c;Elasticsearch作为一款基于Lucene构建的开源搜索引擎&#xff0c;凭借其强大的全文搜索能力、分布式架构以及可扩展性&#xff0c;在日志分析、实时监控、应用搜索等多个领域得到了广泛应用。然而&#xff0c;随着数据量的不断…

前缀和算法——部分OJ题详解

&#xff08;文章的题目解释可能存在一些问题&#xff0c;欢迎各位小伙伴私信或评论指点&#xff08;双手合十&#xff09;&#xff09; 关于前缀和算法 前缀和算法解决的是“快速得出一个连续区间的和”&#xff0c;以前求区间和的时间复杂度是O(N)&#xff0c;使用前缀和可…

【精品资料】大数据可视化平台数据治理方案(626页WORD)

引言&#xff1a;大数据可视化平台的数据治理方案是一个综合性的策略&#xff0c;旨在确保大数据的质量、安全性、可访问性和合规性&#xff0c;从而支持高效的数据分析和可视化过程。 方案介绍&#xff1a; 大数据可视化平台的数据治理方案是一个综合性的策略&#xff0c;旨在…

Netty HTTP

Netty 是一个高性能的异步事件驱动的网络应用程序框架&#xff0c;支持快速开发可维护的高性能协议服务器和客户端。它广泛应用于开发网络应用程序&#xff0c;如服务器和客户端协议的实现。Netty 提供了对多种传输类型的抽象&#xff0c;如 TCP/IP 和 UDP/IP 等&#xff0c;使…

微软的vscode和vs2022快捷键官网链接

vscode官方文档:https://code.visualstudio.com/docs/ vscode快捷键官方文档:https://code.visualstudio.com/docs/getstarted/keybindings vs2022官方文档:https://learn.microsoft.com/zh-cn/visualstudio/ide/?viewvs-2022 vscode快捷键官方文档:https://learn.microsoft.c…

Qt Style Sheets

样式表语法 Qt 样式表术语和语法规则几乎与 HTML CSS 的相同。如果您已经了解 CSS&#xff0c;您可能可以快速浏览此部分。 样式规则 样式表由一系列样式规则组成。样式规则由选择器和声明组成。选择器指定哪些小部件受该规则影响&#xff1b;声明指定应在小部件上设置哪些属性…

python基础知识点(蓝桥杯python科目个人复习计划70)

继续打基础&#xff0c;爬虫部分随笔 第一题&#xff1a;特别数的和 题目描述&#xff1a; 小明对数位中含有2、0、1、9的数&#xff08;不包含前导0&#xff09;很感兴趣&#xff0c;在1到40中这样的数共有28个&#xff0c;它们的和是574。 请问在1到n中&#xff0c;这样的…

提高Java程序效率:ImmutableList、Stream API 和 JSON序列化实战指南

常用列表构建方法&#xff1a; 1.ImmutableList.of() &#xff1a; 静态方法、不可变的列表 可以接受任意数量的参数&#xff0c;并将它们作为元素添加到新创建的列表中&#xff0c;但是一旦创建&#xff0c;集合的内容就不能被改变。在多线程环境中非常有用&#xff0c;因为…

Linux编程(通信协议---udp)

UDP&#xff08;用户数据报协议&#xff09;是一种无连接的网络协议&#xff0c;主要用于快速传输数据。以下是UDP协议的一些主要特点&#xff1a; 1. **无连接**&#xff1a;UDP是无连接的协议&#xff0c;这意味着在数据传输之前不需要建立连接。每个UDP数据包都是独立的&am…

OpenSearch分析CloudTrail日志的实用案例

在AWS环境中,CloudTrail日志提供了宝贵的洞察,而OpenSearch则为分析这些日志提供了强大的工具。本文将介绍15个使用OpenSearch分析CloudTrail日志的实用案例,帮助您更好地理解和管理AWS环境。 1. 监控用户登录活动 查询: eventName: "ConsoleLogin" 这个查询可…

Spark的动态资源分配算法

文章目录 前言基于任务需求进行资源请求的整体过程资源申请的生成过程详解资源申请的生成过程的简单例子资源调度算法的代码解析 申请资源以后的处理&#xff1a;Executor的启动或者结束对于新启动的Container的处理对于结束的Container的处理 基于资源分配结果进行任务调度Pen…