【满分】【华为OD机试真题2023 JAVA&JS】预定酒店

该问题是一个编程挑战,要求从给定的酒店价格数组中找出最接近指定价位的k个价格,并按升序输出。解决方案包括创建自定义类存储价格和差价,排序后选取最接近的k个价格。提供的Java和JavaScript代码实现了这一逻辑。
摘要由CSDN通过智能技术生成

预定酒店

知识点排序

 时间限制:1s 空间限制:256MB 限定语言:不限

题目描述:

放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为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

输入:

10 5 6

1 2 3 4 5 6 7 8 9 10

输出:

4 5 6 7 8

说明:

数组长度n = 10,筛选个数k = 5,目标价位x=6

示例2

输入:

10 4 6

10 9 8 7 6 5 4 3 2 1

输出:

4 5 6 7

说明:

数组长度n = 10,筛选个数k = 4,目标价位x=6

当4和8距离x相同时,优先选择价格低的4

示例3

输入:

6 3 1000

30 30 200 500 70 300

输出:

200 300 500

解题思路:

1、使用hotel类来记录酒店价格和心理差价

2、根据心理差价,从集合中获取合适的酒店,并按照差价进行降序排序

3、根据k值获取集合中的酒店价格,然后对价格进行升序输出

代码(JAVA):

public class Main{
 
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
 
        int n = sc.nextInt();
        int k = sc.nextInt();
        int x = sc.nextInt();
        int[] A = new int[n];
 
        List<Hotel> list = new ArrayList<>();
        for(int i=0; i<n; i++){
            A[i] = sc.nextInt();
            Hotel hotel = new Hotel( A[i], Math.abs( A[i] - x));
            list.add(hotel);
        }
 
        Collections.sort(list);
 
        int[] resInts = new int[k];
        for(int i=0; i<k; i++){
            resInts[i] = list.get(i).price;
        }
 
        Arrays.sort(resInts);
 
        String res = "";
        for(int i : resInts){
            res += i + " ";
        }
 
        System.out.println(res.substring(0, res.length()-1));
 
    }
 
    public static class Hotel implements Comparable<Hotel>{
 
        //酒店价格
        public int price;
 
        //与心理价格差距
        public int difPrice;
 
        public Hotel(int price, int difPrice) {
            this.price = price;
            this.difPrice = difPrice;
        }
 
        @Override
        public int compareTo(Hotel hotel) {
            if(this.difPrice == hotel.difPrice){
                return this.price - hotel.price;
            }
            return this.difPrice - hotel.difPrice;
        }
    }
}

满分答案(JAVA):

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] s = sc.nextLine().split(" ");
        int n = Integer.parseInt(s[0]);
        int k = Integer.parseInt(s[1]);
        int x = Integer.parseInt(s[2]);
        Integer[] integers = Arrays.stream(sc.nextLine().split(" ")).map(Integer::parseInt).toArray(Integer[]::new);
 
        ArrayList<int[]> res = new ArrayList<>();
        for (int i = 0; i < integers.length; i++) {
            Integer integer = integers[i];
            int[] ints = new int[2];
            int abs = Math.abs(integer - x);
            ints[0] = integer;
            ints[1] = abs;
            res.add(ints);
        }
        Collections.sort(res, (o1, o2) -> {
            if (o1[1] == o2[1]) {
                return o1[0] - o2[0];
            } else {
                return o1[1] - o2[1];
            }
        });
        ArrayList<Integer> integers1 = new ArrayList<>();
        for (int i = 0; i < k; i++) {
            int i1 = res.get(i)[0];
            integers1.add(i1);
        }
        Collections.sort(integers1);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < integers1.size(); i++) {
            sb.append(integers1.get(i)).append(" ");
        }
 
        System.out.println(sb.deleteCharAt(sb.length()-1));
 
    }
}

满分答案(JS): 

//let input1 = readline().split(" ").map(Number);
let input1 = "6 3 1000".split(" ").map(Number);
let n = input1[0];
let k = input1[1];
let x = input1[2];
 
//let integers = readline().split(" ").map(Number);
let integers = "30 30 200 500 70 300".split(" ").map(Number);
 
let res = [];
for (let i = 0; i < integers.length; i++) {
    let integer = integers[i];
    let ints = [];
    let abs = Math.abs(integer - x);
    ints[0] = integer;
    ints[1] = abs;
    res.push(ints);
}
 
res.sort((o1, o2) => {
    if (o1[1] == o2[1]) {
        return o1[0] - o2[0];
    } else {
        return o1[1] - o2[1];
    }
});
 
let integers1 = [];
for (let i = 0; i < k; i++) {
    let i1 = res[i][0];
    integers1.push(i1);
}
 
integers1.sort();
let sb = "";
for (let i = 0; i < integers1.length; i++) {
    sb += integers1[i] + " ";
}
 
console.log(sb.substring(0, sb.length - 1));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农阿凯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值