华为OD E卷(100分)50-预订酒店
前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
暑假来临,卢小姐计划前往某个旅游景点游玩。他在网上搜索到了各种价位的酒店,这些酒店的价格存储在一个长度为 nnn 的数组 AAA 中。卢小姐的心理价位是 xxx 元。现在,请你帮助卢小姐从这些酒店中筛选出 kkk 个价格最接近 xxx 元的酒店(n≥k>0),并按照价格从低到高的顺序打印这些酒店的价格。
输入描述
第一行包含三个整数 n、k 和 x,分别表示酒店数量、需要筛选的酒店数量和卢小姐的心理价位。
第二行包含 n 个整数 A1,A2,…,An,表示每家酒店的价格。
输出描述
输出一行,包含 k 个整数,表示筛选出的 k 个酒店的价格,按照从低到高的顺序排列。
示例1
输入:
10 5 6 1 2 3 4 5 6 7 8 9 10
输出:
4 5 6 7 8
说明:从10个酒店中选择5个最接近6元的酒店,按价格从低到高排序后输出。
示例2
输入:
10 4 6 10 9 8 7 6 5 4 3 2 1
输出:
4 5 6 7
说明:从10个酒店中选择4个最接近6元的酒店,按价格从低到高排序后输出。
示例3
输入:
6 3 1000 30 30 200 500 70 300
输出:
200 300 500
说明:从6个酒店中选择3个最接近1000元的酒店,按价格从低到高排序后输出。
数据范围
- 1≤n≤10^5
- 1≤k≤n
- 1≤x≤10^9
- 1≤Ai≤10^9
题解
Java实现
package huawei.e100;import java.util.Arrays;
import java.util.Scanner;/**
* @author arnold
* @date 2025年1月7日
* 预订酒店*/
public class T50 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()){int n = sc.nextInt();int k = sc.nextInt();int x = sc.nextInt();int[] data = new int[n];// 记录差值int[] diff = new int[n];for (int i = 0; i < n; i++) {data[i] = sc.nextInt();diff[i] = Math.abs(data[i] -x);}// 找出满足条件的最大差值Arrays.sort(diff);int maxDiff = diff[k-1];// 查找满足条件的第一个值Arrays.sort(data);int startIndex = 0;for (int i = 0; i < data.length; i++) {if(Math.abs(data[i] -x) <= maxDiff) {startIndex = i;break;}}// 按顺序输出for (int i = startIndex; i < startIndex + k; i++) {System.out.print(data[i] + " ");}}}}