华为OD机试 - 多段线数据压缩(Java 2024 D卷 100分)

2024-06-17 05:20

本文主要是介绍华为OD机试 - 多段线数据压缩(Java 2024 D卷 100分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

华为OD机试 2024D卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

下图中,每个方块代表一个像素,每个像素用其行号和列号表示。

在这里插入图片描述

为简化处理,多段线的走向只能是水平、竖直、斜向45度。

上图中的多段线可以用下面的坐标串表示:(2,8),(3,7),(3,6),(3,5),(4,4),(5,3),(6,2),(7,3),(8,4),(7,5)。

但可以发现,这种表示不是最简的,其实只需要存储6个蓝色的关键点即可,它们是线段的起点、拐点、终点,而剩下4个点是冗余的。

现在,请根据输入的包含有几余数据的多段线坐标列表,输出其最化的结果。

二、输入描述

形如2 8 3 7 3 6 3 5 4 4 5 3 6 2 7 3 8 4 7 5

1、所有数字以空格分隔,每两个数字一组,第一个数字是行号,第二个数字是列号;

2、行号和列号范围为[0,64),用例输入保证不会越界,考生不必检查;

3、输入数据至少包含两个坐标点。

三、输出描述

形如2 8 3 7 3 5 6 2 8 4 7 5

压缩后的最简化坐标列表,和输入数据的格式相同。

补充说明

输出的坐标相对顺序不能变化。

四、解题思路

这个问题的核心是找到路径中的关键点,关键点定义为路径中方向发生变化的点。为了找到这些关键点,我们需要遍历路径中的所有点,计算每个点相对于前一个点的方向,并检查是否发生了方向变化。如果发生了方向变化,则记录当前点为关键点。

具体解题步骤如下:

  1. 初始化变量:
    • 读取输入的坐标数组。
    • 初始化上一个点的坐标 prevX 和 prevY。
    • 初始化上一次的运动方向 prevDirX 和 prevDirY。
  2. 遍历坐标数组:
    • 以步长为2遍历坐标数组,因为每两个元素表示一个点的坐标。
    • 获取当前点的坐标 currX 和 currY。
    • 计算当前点相对于上一个点的偏移量 deltaX 和 deltaY。
    • 计算当前的运动方向 currDirX 和 currDirY,方向的计算是基于偏移量的符号,表示移动的方向(-1、0、1)。
    • 比较当前的运动方向和上一次的运动方向,如果发生了变化,则记录上一个点为关键点。
  3. 记录结果:
    • 最后一个点也是关键点,需要记录下来。
    • 返回所有关键点的字符串表示。

五、Java算法源码

public class Test01 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取并解析输入的坐标数组int[] coordinates = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();// 输出路径中的关键点System.out.println(findKeyPoints(coordinates));}/*** 找出路径中的关键点并返回结果* @param coordinates 路径的坐标数组* @return 关键点的字符串表示*/public static String findKeyPoints(int[] coordinates) {StringJoiner result = new StringJoiner(" ");// 初始化上一个点的坐标int prevX = coordinates[0];int prevY = coordinates[1];// 初始化上一次运动方向int prevDirX = 0;int prevDirY = 0;// 遍历坐标数组,步长为2,因为每两个元素表示一个点的坐标for (int i = 2; i < coordinates.length; i += 2) {int currX = coordinates[i];int currY = coordinates[i + 1];// 计算当前点相对于上一个点的偏移量int deltaX = currX - prevX;int deltaY = currY - prevY;// 计算本次运动方向int maxDelta = Math.max(Math.abs(deltaX), Math.abs(deltaY));int currDirX = deltaX / maxDelta;int currDirY = deltaY / maxDelta;// 如果两次运动的方向不同,则上一个点是拐点,记录下来if (currDirX != prevDirX || currDirY != prevDirY) {result.add(prevX + " " + prevY);}// 更新上一个点的坐标和方向prevX = currX;prevY = currY;prevDirX = currDirX;prevDirY = currDirY;}// 最后一个点也是关键点,记录下来result.add(prevX + " " + prevY);return result.toString();}
}

六、效果展示

1、输入

2 8 3 7 3 6 3 5 4 4 5 3 6 2 7 3 8 4 7 5

2、输出

2 8 3 7 3 5 6 2 8 4 7 5

3、说明

如上图所示,6个蓝色像素的坐标依次是(2,8)、(3,7)、(3,5)、(6,2)、(8,4)、(7,5)。

将他们按顺序出即可。

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

这篇关于华为OD机试 - 多段线数据压缩(Java 2024 D卷 100分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java Stream流与使用操作指南

《JavaStream流与使用操作指南》Stream不是数据结构,而是一种高级的数据处理工具,允许你以声明式的方式处理数据集合,类似于SQL语句操作数据库,本文给大家介绍JavaStream流与使用... 目录一、什么是stream流二、创建stream流1.单列集合创建stream流2.双列集合创建str

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。