华为OD机试真题---预定酒店
华为OD机试真题中的“预定酒店”题目是一道典型的算法题,主要考察的是如何在给定的酒店价格数组中找到最接近心理价位的k个酒店,并按价格从低到高输出。以下是对该题目的详细解析:
一、题目描述
放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店(n>=k>0),并由低到高打印酒店的价格。
备注:
1)酒店价格数组A和小明的心理价位x均为整型数据;(0 < n,k,x < 10000)
2)优先选择价格最接近心理价位的酒店;若两家酒店和心理价位差价相同,则选择价格较低的酒店。(比如100元和300元距离心理价位200元同样接近,此时选择100元);
3)酒店价格可能相同重复。
二、输入描述
- 第一行:n,k,x,分别表示酒店价格数组的长度、需要筛选出的酒店数量以及小明的心理价位。
- 第二行:A[0] A[1] A[2]…A[n-1],表示酒店的价格数组。
三、输出描述
从低到高打印筛选出的酒店价格。
补充说明:
1)酒店价格数组A和小明的心理价位x均为整型数据
2)优先选择价格最接近心理价位的酒店;若两家酒店距离心理价位差价相同,则选择价格较低的酒店。(比如100元和300元距离心理价位200元同样接近,此时选择100元)
3)酒店价格可能相同重复。
四、示例
示例1:
- 输入:5 3 10 12 15 10 9 11
- 输出:9 10 11
示例2:
- 输入:10 4 6 1 2 3 4 5 6 7 8 9 10
- 输出:4 5 6 7
五、解题思路
-
读取输入:
- 使用
Scanner
类读取输入的n、k、x以及酒店价格数组A。
- 使用
-
计算差值:
- 遍历酒店价格数组A,计算每个酒店价格与心理价位x的差值
diff = |price - x|
。 - 创建一个类(如
HotelPriceDiff
)或数据结构(如Pair
)来存储价格和差值信息,以便后续排序。
- 遍历酒店价格数组A,计算每个酒店价格与心理价位x的差值
-
排序:
- 使用优先队列(最小堆)或自定义排序算法对价格和差值信息进行排序。
- 排序规则:首先按照差值升序排序,如果差值相同则按照价格升序排序。
-
筛选结果:
- 从排序后的结果中取出前k个酒店价格。
- 由于题目要求按价格从低到高输出,可以使用
TreeSet
或PriorityQueue
(最小堆)来自动排序结果,或者手动对结果进行排序。
-
输出:
- 打印筛选出的k个酒店价格。
六、解题策略
-
数据结构选择:
- 使用优先队列(最小堆)可以高效地获取最接近心理价位的k个酒店,因为优先队列可以在O(log k)时间内完成插入和删除操作。
- 使用
TreeSet
可以自动对结果进行排序,但需要注意TreeSet
的插入和删除操作时间复杂度为O(log n)。
-
算法效率:
- 遍历酒店价格数组计算差值的时间复杂度为O(n)。
- 优先队列的插入和删除操作时间复杂度为O(log k),因此整体排序的时间复杂度为O(n log k)。
- 如果使用
TreeSet
进行排序,则整体排序的时间复杂度为O(n log n),但在k较小且n较大时,优先队列通常更高效。
-
内存使用:
- 优先队列和
TreeSet
都会占用额外的内存来存储元素和进行比较操作。 - 如果内存使用是一个关键因素,可以考虑使用数组和手动排序算法来减少内存占用。
- 优先队列和
七、代码实现(队列)
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.TreeSet;public class HotelSelection {// 定义一个内部类来存储价格和差值信息static class HotelPriceDiff {int price;int diff;HotelPriceDiff(int price, int diff) {this.price = price;this.diff = diff;}}public static void main(String[] args) {// 创建Scanner对象以读取输入Scanner scanner = new Scanner(System.in);// 读取输入int n = scanner.nextInt(); // 酒店数量int k = scanner.nextInt(); // 需要选择的酒店数量int x = scanner.nextInt(); // 顾客的心理价位// 创建一个数组来存储每家酒店的价格int[] prices = new int[n];for (int i = 0; i < n; i++) {prices[i] = scanner.nextInt();}// 使用优先队列(最小堆)来存储价格和差值信息PriorityQueue<HotelPriceDiff> pq = new PriorityQueue<>((a, b) -> {// 自定义比较规则:首先按照差值升序排序,差值相同则按照价格升序排序if (a.diff != b.diff) {return Integer.compare(a.diff, b.diff);} else {return Integer.compare(a.price, b.price);}});// 计算每个酒店价格与顾客心理价位的差值,并将酒店信息加入优先队列for (int price : prices) {int diff = Math.abs(price - x);pq.offer(new HotelPriceDiff(price, diff));}// 从优先队列中取出前k个最接近心理价位的酒店价格TreeSet<Integer> result = new TreeSet<>(); // 使用TreeSet自动排序结果while (!pq.isEmpty() && result.size() < k) {result.add(pq.poll().price);}// 打印结果for (int price : result) {System.out.print(price + " ");}}
}
八、代码实现(数组)
import java.util.*; public class HotelReservation { // 定义一个内部类来存储价格和差值 static class PriceDiff { int diff; int price; PriceDiff(int diff, int price) { this.diff = diff; this.price = price; } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取输入 int n = scanner.nextInt(); int k = scanner.nextInt(); int x = scanner.nextInt(); int[] prices = new int[n]; for (int i = 0; i < n; i++) { prices[i] = scanner.nextInt(); } // 计算差值并存储在一个列表中 List<PriceDiff> priceDiffs = new ArrayList<>(); for (int price : prices) { int diff = Math.abs(price - x); priceDiffs.add(new PriceDiff(diff, price)); } // 根据差值排序,如果差值相同则按价格排序 Collections.sort(priceDiffs, Comparator.comparingInt(a -> a.diff).thenComparingInt(a -> a.price)); // 筛选前k个价格 List<Integer> topKPrices = new ArrayList<>(); for (int i = 0; i < k; i++) { topKPrices.add(priceDiffs.get(i).price); } // 对结果排序(虽然已经在上一步中按差值排序过,但题目要求按价格排序,这里再次确保) Collections.sort(topKPrices); // 输出结果 for (int price : topKPrices) { System.out.print(price + " "); } }
}示例1:输入:5 3 10 12 15 10 9 11
输出:9 10 11
九、注意事项
- 输入验证:在实际应用中,需要对输入进行验证,确保n、k、x以及价格数组A的输入格式正确。
- 性能优化:在处理大规模数据时,需要注意算法的性能优化,如使用更高效的数据结构或算法来减少时间复杂度。
- 边界情况:需要考虑边界情况,如k等于n、价格数组A中有重复价格等。
十、运行实例解析
输入
10 5 6
1 2 3 4 5 6 7 8 9 10
-
读取输入:
n = 10
:表示酒店价格数组的长度。k = 5
:表示需要筛选出的最接近心理价位的酒店数量。x = 6
:表示小明的心理价位。A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
:表示酒店的价格数组。
-
计算差值:
- 对于每个价格,计算其与心理价位
x
的差值diff = |price - x|
。
- 对于每个价格,计算其与心理价位
-
使用优先队列(最小堆):
- 创建一个优先队列,按照差值升序排序,差值相同时按价格升序排序。
- 将每个价格及其差值加入优先队列。
-
筛选前k个价格:
- 从优先队列中依次取出前
k
个元素(即最接近心理价位的酒店价格)。 - 由于优先队列已经按照差值和价格排序,所以取出的前
k
个元素就是符合条件的酒店价格。
- 从优先队列中依次取出前
-
输出结果:
- 将筛选出的酒店价格按升序打印出来。
十一、运行步骤
-
初始化优先队列。
-
遍历价格数组
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
,计算差值并加入优先队列:1
:差值5
2
:差值4
3
:差值3
4
:差值2
5
:差值1
6
:差值0
(最接近)7
:差值1
8
:差值2
9
:差值3
10
:差值4
优先队列中的元素(按差值和价格排序)将是:
(6, 0)
(5, 1)
(7, 1)
(4, 2)
(8, 2)
(3, 3)
(9, 3)
(2, 4)
(10, 4)
(1, 5)
(但实际上我们只需要前5个)
-
从优先队列中取出前5个元素:
6
5
7
4
8
-
打印输出结果:
4 5 6 7 8
十二、结论
对于给定的输入,程序将正确地筛选出最接近心理价位6
的5个酒店价格,并按升序打印出来。输出结果为4 5 6 7 8
,与预期相符。
相关文章:
华为OD机试真题---预定酒店
华为OD机试真题中的“预定酒店”题目是一道典型的算法题,主要考察的是如何在给定的酒店价格数组中找到最接近心理价位的k个酒店,并按价格从低到高输出。以下是对该题目的详细解析: 一、题目描述 放暑假了,小明决定到某旅游景点游…...
力扣242.有效的字母异位词
题目链接:242. 有效的字母异位词 - 力扣(LeetCode) 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。 示例 1: 输入: s "anagram", t "nagaram"输出: true 示例 2: 输入: s &q…...
Android IP路由策略和防火墙
Android IP路由策略和防火墙 Platform: RK3368 OS: Android 6.0 Kernel: 3.10.0 文章目录 Android IP路由策略和防火墙ip route, ip rule, iptables简介ip routeip ruleiptables Android路由策略Android路由策略优先级命令查看当前路由策略 Android路由表命令查看路由表命令…...
MySQL insert ... select 语句锁表导致数据写不进去
问题现象 调用后台接口向表 t1 insert 写入数据时一直等待直到超时,猜测表 t1 被其它事务加锁了没有释放。 问题分析 在发生死锁时,通过执行下面命令查看事务和锁信息: select * from information_schema.INNODB_TRX 用来查看正在运行的事…...

Android摄像头Camera2和Camera1的一些总结
Android 系统对摄像头的同时使用有限制,不能同时使用摄像头进行预览或者录制音视频。 例如:界面上有两个SurfaceView, 这两个SurfaceView不能同时预览或者录制音视频,只能有一个正常工作(一个SurfaceView预览前置摄像头ÿ…...
【Linux 从基础到进阶】Linux中的用户认证与授权
Linux中的用户认证与授权 1. 引言 在Linux系统中,**用户认证(authentication)和授权(authorization)**是两个核心的安全机制,用来控制系统资源的访问和管理用户操作权限。用户认证确保登录的用户是合法的…...

用户界面设计:视觉美学与交互逻辑的融合
1、什么是用户界面 用户界面(UI)是人与机器之间沟通的桥梁,同时也是用户体验(UX)的重要组成部分。用户界面设计包括两个核心要素:视觉设计(即产品的外观和感觉)和交互设计ÿ…...

ZK集群搭建:详细步骤与注意事项
在大数据和分布式系统日益重要的今天,ZooKeeper(简称ZK)作为一种分布式协调服务,扮演着举足轻重的角色。它主要用于管理大型分布式系统中的配置信息、命名、同步等。下面将详细介绍如何搭建一个ZooKeeper集群,帮助大家…...

如何将csdn文章导出为pdf
前言 在csdn上浏览文章的时候我发现有的文章支持pdf导出,但是有的文章不支持pdf导出,为了解决能将csdn上所有文章都能以pdf格式导出遂作此文。 正文 先上代码: (function(){use strict;var contentBox $("div.article_content")…...
【艾思科蓝】Imagen:重塑图像生成领域的革命性突破
【连续七届已快稳ei检索】第八届电子信息技术与计算机工程国际学术会议(EITCE 2024)_艾思科蓝_学术一站式服务平台 更多学术会议请看 学术会议-学术交流征稿-学术会议在线-艾思科蓝 目录 引言 一、Imagen模型的技术原理 1. 模型概述 2. 工作流程 …...

java类和对象(下): 封装 static成员 内部类
前言: 在前期的知识点中,我们学习了java中this函数的使用和相关的概念。这期我们将介绍封装的概念,以及常见内部类的使用,让我们开车吧!!!! 本期目录: 6. 封装 7. st…...

外包干了3周,技术退步太明显了。。。。。
先说一下自己的情况,大专生,21年通过校招进入武汉某软件公司,干了差不多3个星期的功能测试,那年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我才在一个外包企业干了3周的功…...

VIVO算法题——数位之积
记录算法究极无敌菜菜菜鸟的垃圾思维 题目: 现给定任意正整数 n,请寻找并输出最小的正整数 m(m>9),使得 m 的各位(个位、十位、百位 … …)之乘积等于n,若不存在则输出 -1。 菜鸟…...

OPC Router快速打通设备层与influxDB数据通讯
随着时代演化,数据量呈几何倍数增加的情况下出现了时序数据库。时序数据库是基于时间进行存储的数据库,每一条数据中都有一个时间戳,这种数据库特别适合存储那些随着时间变化的数据,通过一些工具处理后,能够分析出数据…...

鸿蒙开发 四十四 ArkTs BuilderParam传递UI(二)
子组件多个BuilderParam,必须通过参数的方式传入,如果界面中有多个界面需要传递,可以定义多个尾随闭包,如图: 在自定义组件中调用: 在使用时候调用是作为参数传递给自定义的组件,参数是界面&…...

同期数分析-留存率
目录 同期数分析 加载数据 单月实现 统计每个月的订单量 求2月份的订单量和用户数量 求2月之前的历史订单量 筛选出2023年2月的新增的用户数 计算2023年2月在后面的留存情况 完整的2023年2月份同期群结果 遍历合并和分析 引入月份列表 遍历 调整成留存率的形式 回…...
Java前后端交互:构建现代Web应用
在现代Web应用开发中,前后端分离是一种常见的架构模式。后端通常负责数据处理和业务逻辑,而前端则负责用户界面和用户体验。Java作为后端开发的强大语言,提供了多种方式与前端进行交互。本文将探讨Java后端与前端交互的几种主要方式ÿ…...
vue3中用axios请求怎么添加cookie
在 Vue 3 中使用 axios 发起请求时,可以通过配置 axios 的请求选项来携带 Cookies。具体来说,确保跨域请求时,设置 withCredentials: true,以便发送和接收 Cookies。 1. Axios 配置携带 Cookie 首先确保你在 axios 请求中设置了…...

informer学习笔记
一、informer讲解 infomer 要解决的三大问题: Attention计算的更快Decoder要一次性输出所有预测堆叠encoder也要更快 1. Attention 在长序列中,并非每一个位置的Attention都重要,对于每一个Q来说,只有一小部分的K与其有较强的…...
Elasticsearch介绍和使用
一、Elasticsearch 强大的搜索和分析能力: Elasticsearch 是一个基于 Lucene 的分布式搜索和分析引擎。它能够快速地对大量数据进行全文搜索、结构化搜索和复杂的数据分析操作。对于大型数据集,它可以高效地处理各种查询需求,包括关键词搜索…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...