华为OD机试真题---预定酒店

embedded/2024/10/17 19:03:45/

华为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
解题思路
  1. 读取输入

    • 使用Scanner类读取输入的n、k、x以及酒店价格数组A。
  2. 计算差值

    • 遍历酒店价格数组A,计算每个酒店价格与心理价位x的差值diff = |price - x|
    • 创建一个类(如HotelPriceDiff)或数据结构(如Pair)来存储价格和差值信息,以便后续排序。
  3. 排序

    • 使用优先队列(最小堆)或自定义排序算法对价格和差值信息进行排序。
    • 排序规则:首先按照差值升序排序,如果差值相同则按照价格升序排序。
  4. 筛选结果

    • 从排序后的结果中取出前k个酒店价格。
    • 由于题目要求按价格从低到高输出,可以使用TreeSetPriorityQueue(最小堆)来自动排序结果,或者手动对结果进行排序。
  5. 输出

    • 打印筛选出的k个酒店价格。
解题策略
  1. 数据结构选择

    • 使用优先队列(最小堆)可以高效地获取最接近心理价位的k个酒店,因为优先队列可以在O(log k)时间内完成插入和删除操作。
    • 使用TreeSet可以自动对结果进行排序,但需要注意TreeSet的插入和删除操作时间复杂度为O(log n)。
  2. 算法效率

    • 遍历酒店价格数组计算差值的时间复杂度为O(n)。
    • 优先队列的插入和删除操作时间复杂度为O(log k),因此整体排序的时间复杂度为O(n log k)。
    • 如果使用TreeSet进行排序,则整体排序的时间复杂度为O(n log n),但在k较小且n较大时,优先队列通常更高效。
  3. 内存使用

    • 优先队列和TreeSet都会占用额外的内存来存储元素和进行比较操作。
    • 如果内存使用是一个关键因素,可以考虑使用数组和手动排序算法来减少内存占用。

代码实现(队列)

java">
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 + " ");}}
}

代码实现(数组)

java">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

注意事项

  1. 输入验证:在实际应用中,需要对输入进行验证,确保n、k、x以及价格数组A的输入格式正确。
  2. 性能优化:在处理大规模数据时,需要注意算法的性能优化,如使用更高效的数据结构算法来减少时间复杂度。
  3. 边界情况:需要考虑边界情况,如k等于n、价格数组A中有重复价格等。

运行实例解析

输入

10 5 6
1 2 3 4 5 6 7 8 9 10
  1. 读取输入

    • n = 10:表示酒店价格数组的长度。
    • k = 5:表示需要筛选出的最接近心理价位的酒店数量。
    • x = 6:表示小明的心理价位。
    • A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:表示酒店的价格数组。
  2. 计算差值

    • 对于每个价格,计算其与心理价位x的差值diff = |price - x|
  3. 使用优先队列(最小堆)

    • 创建一个优先队列,按照差值升序排序,差值相同时按价格升序排序。
    • 将每个价格及其差值加入优先队列。
  4. 筛选前k个价格

    • 从优先队列中依次取出前k个元素(即最接近心理价位的酒店价格)。
    • 由于优先队列已经按照差值和价格排序,所以取出的前k个元素就是符合条件的酒店价格。
  5. 输出结果

    • 将筛选出的酒店价格按升序打印出来。

运行步骤

  1. 初始化优先队列。

  2. 遍历价格数组[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个)
  3. 从优先队列中取出前5个元素:

    • 6
    • 5
    • 7
    • 4
    • 8
  4. 打印输出结果:

    4 5 6 7 8
    

结论

对于给定的输入,程序将正确地筛选出最接近心理价位6的5个酒店价格,并按升序打印出来。输出结果为4 5 6 7 8,与预期相符。


http://www.ppmy.cn/embedded/127763.html

相关文章

多线程JUC的学习

1、什么是线程&#xff1f; 进程&#xff1a;进程是程序的基本执行实体。一个软件运行之后就是一个进程。 线程&#xff1a;是操作系统能够运行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。简单理解&#xff1a;应用软件中互相独立&#xff…

101 - Lecture 6

1. Operating systems: Examples • 计算机历史上一些重要的操作系统及其发展时间。从1960年代的OS/360&#xff0c;到1970年代的Unix&#xff0c;再到1980年代的MS-DOS和Mac OS&#xff0c;以及1990年代的Windows 95、98和NT&#xff0c;最后提到了2001年推出的Mac OS X和Lin…

网络知识|网络设计

网络知识|网络设计 主流的防病毒厂商和产品&#xff08;国内、外各列举3个&#xff09; 国外&#xff1a;norton&#xff08;诺顿&#xff09;、kaspersky、Bitdefender 国内&#xff1a;绿盟、奇安信、深信服、天融信 国内外的不同linux产品&#xff08;各列举3个&#xff…

前端技巧汇总

保持盒子在中间位置&#xff1a; 中间盒子设置位绝对定位 上下左右都设置为0 margin为auto中间 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width,…

ADMEMS矩阵

什么是ADMEMS矩阵&#xff1f; ADMEMS矩阵是架构设计中的一种需求分析工具&#xff0c;它的目标是通过系统化的方式分析和整理架构设计中的多层次需求&#xff0c;确保业务需求、用户需求、技术实现、约束条件等都能够得到合理的平衡。矩阵的核心是将广义功能、质量要求和约束…

任务与微任务

JavaScript 本质上是一门单线程语言。自从定时器&#xff08;setTimeout() 和 setInterval()&#xff09;加入到 Web API 后&#xff0c;浏览器提供的 JavaScript 环境就已经逐渐发展到包含 任务调度 、 多线程应用开发 等强大的特性。 JavaScript 执行上下文 JavaScript 代码…

Github 2024-10-14开源项目周报Top14

根据Github Trendings的统计,本周(2024-10-14统计)共有14个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目7C++项目2C项目2Swift项目1Jupyter Notebook项目1Java项目1Rust项目1Python中的算法实现集合 创建周期:2831 天开发语言:Python协议…

C++ AVL树

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦&#xff08;不能私学&#xff0c;谁私学谁是&#xff09; 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知…