华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为 n 的数组 A),他的心理价位是 x 元。请帮他筛选出 k 个最接近 x 元的酒店(n >= k > 0),并由低到高打印酒店的价格。
二、输入描述
第一行:三个整数,分别是 n, k, x。
第二行:n 个整数,表示酒店价格数组 A[0], A[1], …, A[n-1]。
三、输出描述
从低到高打印筛选出的酒店价格。
四、测试用例
测试用例1:
1、输入
10 5 6
1 2 3 4 5 6 7 8 9 10
2、输出
4 5 6 7 8
3、说明
每个价格与心理价位 6 的差值分别为:|1-6|=5, |2-6|=4, |3-6|=3, |4-6|=2, |5-6|=1, |6-6|=0, |7-6|=1, |8-6|=2, |9-6|=3, |10-6|=4。
按照差值从小到大排序,最接近的 5 个价格是:6, 5, 7, 4, 8。
最后,将这 5 个价格按从小到大的顺序输出:4, 5, 6, 7, 8。
测试用例2:
1、输入
10 4 6
10 9 8 7 6 5 4 3 2 1
2、输出
4 5 6 7
3、说明
计算每个价格与心理价位 6 的差值:
|10-6|=4, |9-6|=3, |8-6|=2, |7-6|=1, |6-6|=0, |5-6|=1, |4-6|=2, |3-6|=3, |2-6|=4, |1-6|=5
按照差值从小到大排序,最接近的 4 个价格是:6, 7, 5, 4。
按要求将这 4 个价格按从小到大的顺序输出:4, 5, 6, 7。
五、解题思路
- 计算差值:首先,需要计算每个酒店价格与心理价位 x 之间的差值。这里的差值表示该酒店价格与理想价位的偏离程度。为了存储这些差值和对应的价格,我们使用了一个列表(或数组),并将每个价格和它与 x 的差值作为一对存储在列表中。
- 排序:然后,我们需要对所有酒店按照两条规则进行排序:
- 第一优先级:按与 x 的差值从小到大排序。这是因为我们希望选择距离心理价位最近的酒店。
- 第二优先级:如果差值相同,按价格本身从小到大排序。这是为了在差值相同的情况下,优先选择价格更低的酒店。
- 选择前 k 个价格:在排序之后,我们选择前 k 个价格作为筛选出的酒店价格。
- 结果排序:最后,将选出的 k 个酒店价格进行从小到大的排序,以符合输出要求。
- 输出:输出选出的 k 个酒店价格。
六、Java算法源码
public class OdTest01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入第一行:n, k, x
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();
}
// 创建一个列表来存储价格和与 x 的差值
List<int[]> priceDifferenceList = new ArrayList<>();
for (int price : prices) {
priceDifferenceList.add(new int[]{price, Math.abs(price - x)});
}
// 按照差值从小到大排序,如果差值相同则按价格从小到大排序
Collections.sort(priceDifferenceList, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
if (a[1] != b[1]) {
return a[1] - b[1]; // 比较差值
} else {
return a[0] - b[0]; // 比较价格
}
}
});
// 选择前 k 个价格
List<Integer> result = new ArrayList<>();
for (int i = 0; i < k; i++) {
result.add(priceDifferenceList.get(i)[0]);
}
// 对结果价格从小到大排序
Collections.sort(result);
// 输出结果
for (int i = 0; i < result.size(); i++) {
System.out.print(result.get(i));
if (i != result.size() - 1) {
System.out.print(" ");
}
}
}
}
七、效果展示
1、输入
6 3 1000
30 30 200 500 70 300
2、输出
200 300 500
3、说明
计算每个价格与心理价位 1000 的差值:
|30-1000| = 970, |30-1000| = 970, |200-1000| = 800, |500-1000| = 500, |70-1000| = 930, |300-1000| = 700
按照差值从小到大排序,最接近的 3 个价格是:500, 300, 200。
按要求将这 3 个价格按从小到大的顺序输出:200, 300, 500。
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。