一、题目描述
放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的 数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店 (n>=k>0) ,并由低到高打印酒店的价格。
二、输入描述
第一行: n,k,x
第二行: A[o] A[1] A[2]…A[n-1]
三、输出描述
从低到高打印筛选出的酒店价格。
四、解题思路
- 读取输入的酒店数量 hotelCount,选择数量 selectCount,和心理价位 targetPrice;
- 创建一个大小为 hotelCount 的整数数组 priceArr,用于存储酒店价格;
- 循环读取 hotelCount 个价格,并将其存储到 priceArr 数组中;
- 对 priceArr 数组进行排序,以便按价格从低到高进行处理;
- 创建一个 ArrayList,用于存储每个酒店价格与心理价位的差值;
- 遍历排序后的 priceArr 数组,计算每个酒店价格与 targetPrice 的差值,并将酒店价格和差值存储到 ArrayList 中;
- 根据差值对 ArrayList 进行排序,如果差值相同,则按价格从低到高进行排序;
- 创建一个 ArrayList,用于存储筛选出的酒店价格;
- 遍历排序后的 ArrayList,将前 selectCount 个酒店价格加入到筛选列表中;
- 对筛选列表进行排序,以便按价格从低到高打印;
- 遍历筛选列表,按顺序打印酒店价格;
五、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 相同时,优先选择价格低的。
- 对酒店价格进行排序
- 酒店价格与心理价位差值
- 根据差值进行排序
- 筛选出的酒店价格
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。