算法题目
放暑假的时候,小明打算去某旅游景点游玩。他在网上搜索到了不同价位的酒店,这些酒店的价格用一个长度为 n
的数组 A
来表示。小明心里有一个理想的价位 x
元,现在需要你帮他从搜索到的酒店中筛选出 k
个最接近 x
元的酒店,并且要把这些酒店的价格按照从低到高的顺序打印出来。
输入描述如下:
第一行包含三个整数 n
、k
、x
。其中,n
代表在网上搜索到的酒店数量,x
是小明的心理价位,k
是要筛选出的最接近心理价位的酒店个数。
第二行是 n
个酒店的价格,用数组 A[0] A[1] A[2]...A[n - 1]
表示。
输出描述为:按照从低到高的顺序输出筛选出的酒店价格。
示例如下:
示例一:
输入:
10 5 6
1 2 3 4 5 6 7 8 9 10
输出:
4 5 6 7 8
示例二:
输入:
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。
示例三:
输入:
6 3 1000
30 30 200 500 70 300
输出:
200 300 500
备注:
- 酒店价格数组
A
和小明的心理价位x
都是整型数据,它们的取值范围是 0 < n, k, x < 10000。 - 优先选择价格最接近心理价位的酒店。如果有两家酒店和心理价位的差价相同,那么选择价格较低的酒店。例如,100 元和 300 元距离心理价位 200 元同样接近,此时应选择 100 元。
- 酒店价格可能会出现相同重复的情况。
解题思路
要解决这个问题,我们可以按照以下步骤进行:
- 首先,计算每个酒店价格与心理价位的距离。为了方便后续处理,我们把每个酒店价格和它与心理价位的距离组合成一个元组,存储在数组
near_prices
中。例如,对于价格为 50 元,心理价位为 60 元的情况,元组就是(50, 10)
,其中 10 是 50 与 60 的距离。 - 接着,对
near_prices
数组进行排序。排序的规则是先按照距离从小到大排序,如果距离相同,再按照价格从小到大排序。这样可以保证我们优先选择距离心理价位近且价格低的酒店。 - 然后,从排序好的
near_prices
数组中取出前k
个元素,这些元素对应的酒店价格就是最接近心理价位的。 - 最后,对取出的这
k
个酒店价格进行排序,使其按照从低到高的顺序排列,再将排序后的结果返回。
示例代码
def solve_method(k, x, prices):
near_prices = []
# 计算各个价格与心理价位的距离
for p in prices:
near_prices.append((p, abs(p - x)))
# 按照距离从小到大排序,距离相同时,按照价格从小到大排序
near_prices.sort(key=lambda x: (x[1], x[0]))
# 取前k个与心理价位最近的酒店价格
ans = list(map(lambda x: x[0], near_prices[:k]))
ans.sort()
return ans
if __name__ == '__main__':
assert solve_method(5, 6, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) == [4, 5, 6, 7, 8]
assert solve_method(4, 6, [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]) == [4, 5, 6, 7]
assert solve_method(3, 1000, [30, 30, 200, 500, 70, 300]) == [200, 300, 500]