华为OD机试真题 Java 实现【预定酒店】【2022Q4 100分】-LMLPHP

一、题目描述

放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的 数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店 (n>=k>0) ,并由低到高打印酒店的价格。

二、输入描述

第一行: n,k,x
第二行: A[o] A[1] A[2]…A[n-1]

三、输出描述

从低到高打印筛选出的酒店价格。

四、解题思路

  1. 读取输入的酒店数量 hotelCount,选择数量 selectCount,和心理价位 targetPrice;
  2. 创建一个大小为 hotelCount 的整数数组 priceArr,用于存储酒店价格;
  3. 循环读取 hotelCount 个价格,并将其存储到 priceArr 数组中;
  4. 对 priceArr 数组进行排序,以便按价格从低到高进行处理;
  5. 创建一个 ArrayList,用于存储每个酒店价格与心理价位的差值;
  6. 遍历排序后的 priceArr 数组,计算每个酒店价格与 targetPrice 的差值,并将酒店价格和差值存储到 ArrayList 中;
  7. 根据差值对 ArrayList 进行排序,如果差值相同,则按价格从低到高进行排序;
  8. 创建一个 ArrayList,用于存储筛选出的酒店价格;
  9. 遍历排序后的 ArrayList,将前 selectCount 个酒店价格加入到筛选列表中;
  10. 对筛选列表进行排序,以便按价格从低到高打印;
  11. 遍历筛选列表,按顺序打印酒店价格;

五、Java算法源码

public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int hotelCount = sc.nextInt();
        int selectCount = sc.nextInt();
        int targetPrice = sc.nextInt();
        int[] priceArr = new int[hotelCount];

        for (int i = 0; i < hotelCount; i++) {
            priceArr[i] = sc.nextInt();
        }
        // 对酒店价格进行排序
        Arrays.sort(priceArr);

		// 酒店价格与心理价位差值
        ArrayList<int[]> list = new ArrayList<>();
        for (int i = 0; i < hotelCount; i++) {
            int price = priceArr[i];
            int[] arr = new int[2];
            arr[0] = price;
            arr[1] = Math.abs(price - targetPrice);
            list.add(arr);
        }

		// 根据差值进行排序
        Collections.sort(list, (o1, o2) -> {
            if (o1[1] == o2[1]) {
                return o1[0] - o2[0];
            } else {
                return o1[1] - o2[1];
            }
        });

		// 筛选出的酒店价格
        List<Integer> selectedHotels = new ArrayList<>();
        for (int i = 0; i < selectCount; i++) {
            selectedHotels.add(list.get(i)[0]);
        }

        selectedHotels.sort(Integer::compareTo);

        for (int i = 0; i < selectedHotels.size(); i++) {
            System.out.print(selectedHotels.get(i));
            if (i != selectedHotels.size() - 1) {
                System.out.print(" ");
            }
        }
    }

六、效果展示

1、输入

10 4 6
10 9 8 7 6 5 4 3 2 1

2、输出

4 5 6 7

3、思路

数组长度n = 10,筛选个数 k = 4,目标价位x = 6,当4 和8 距离x 相同时,优先选择价格低的。

  1. 对酒店价格进行排序
  2. 酒店价格与心理价位差值
  3. 根据差值进行排序
  4. 筛选出的酒店价格

华为OD机试真题 Java 实现【预定酒店】【2022Q4 100分】-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

华为OD机试真题 Java 实现【预定酒店】【2022Q4 100分】-LMLPHP

06-06 17:39