ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

预订酒店问题

预订酒店问题 一、题目题目描述放暑假了小明决定到某旅游景点游玩他在网上搜索到了各种价位的酒店长度为n的数组A他的心理价位是x元请帮他筛选出k个最接近x元的酒店nk0,并由低到高打印酒店的价格。输入描述第一行n, k, x第二行A[0] A[1] A[2]…A[n-1]输出描述从低到高打印筛选出的酒店价格示例1输入10 5 61 2 3 4 5 6 7 8 9 1012输出4 5 6 7 81说明示例2输入10 4 610 9 8 7 6 5 4 3 2 112输出4 5 6 71说明示例3输入6 3 100030 30 200 500 70 30012输出200 300 5001说明解题思路输入解释第一行包含三个整数 n、k 和 xn酒店价格数组的长度即有 n 个酒店。k需要选择的最接近心理价位 x 的酒店数量。x用户的心理价位。第二行是酒店价格数组 A其中 A[0] 到 A[n-1] 代表不同酒店的价格。示例说明示例 1输入10 5 61 2 3 4 5 6 7 8 9 1012解释用户心理价位是 6。每个价格与 6 的差距分别是5432101234。按差距排序后最接近的 5 个价格为45678。最终输出为4 5 6 7 8。示例 2输入10 4 610 9 8 7 6 5 4 3 2 112解释用户心理价位是 6。每个价格与 6 的差距分别是4321012345。按差距排序后最接近的 4 个价格为4567。最终输出为4 5 6 7。示例 3输入6 3 100030 30 200 500 70 30012解释用户心理价位是 1000。每个价格与 1000 的差距分别是970970800500930700。按差距排序后最接近的 3 个价格为200300500。最终输出为200 300 500。解题思路优先选择价格最接近心理价位的酒店若两家酒店和心理价位差价相同则选择价格较低的酒店。(比如100元和300元距离心理价位200元同样接近此时选择100元)酒店价格可能相同重复二、代码n,k,xmap(int,input().split())priceslist(map(int,input().split()))sorted_pricessorted(prices)price_ratingsorted([(price,abs(price-x))forpriceinsorted_prices],keylambdaitem:item[1])print(price_rating)picked_pricesorted(item[0]foriteminprice_rating[:k])print(picked_price)print( .join(map(str,picked_price)))说明这段代码中使用了三次sorted()函数第一次sorted()sorted_prices sorted(prices)作用对原始价格列表进行升序排序目的确保后续处理时价格是有序的便于处理相同差值时选择较低价格第二次sorted()price_rating sorted([(price, abs(price - x)) for price in sorted_prices], keylambda item: item[1])作用按价格与心理价位x的绝对差值进行排序关键使用keylambda item: item[1]指定按元组的第二个元素差值排序效果实现最接近优先的排序规则第三次sorted()picked_price sorted(item[0] for item in price_rating[:k])作用对选出的前k个最接近的价格进行升序排序目的满足题目要求由低到高打印酒店的价格这三次sorted()调用分别完成了原始数据排序、按接近程度排序、最终输出排序共同实现了题目的完整逻辑。三、sorted() 方法总结在上面的代码中我们使用了 Python 内置的sorted()函数来对列表进行排序。这里对sorted()方法进行一个详细的总结。1. 基本语法sorted(iterable,keyNone,reverseFalse)iterable: 需要排序的可迭代对象如列表、元组、字符串等。key: 可选参数指定一个函数该函数用于从每个元素中提取一个用于比较的键。reverse: 可选参数布尔值。默认为False表示升序排序设为True则为降序排序。返回值: 返回一个新的已排序列表不会修改原可迭代对象。2. 与 list.sort() 的区别sorted()返回一个新的排序后的列表原列表不变。list.sort()是列表的方法直接修改原列表并返回None。my_list[3,1,2]new_listsorted(my_list)# my_list 不变new_list 为 [1, 2, 3]my_list.sort()# my_list 变为 [1, 2, 3]3. key 参数详解key参数是sorted()最强大的功能之一它允许我们自定义排序规则。a) 按元素的某个属性排序students[(Alice,88),(Bob,95),(Charlie,78)]# 按分数排序sorted_by_scoresorted(students,keylambdas:s[1])# [(Charlie, 78), (Alice, 88), (Bob, 95)]b) 按多个条件排序可以通过返回一个元组来实现多级排序。# 先按分数降序分数相同按名字升序sorted_studentssorted(students,keylambdas:(-s[1],s[0]))c) 使用内置函数words[apple,Banana,cherry,Date]# 不区分大小写排序sorted_wordssorted(words,keystr.lower)# [apple, Banana, cherry, Date]4. 在本题目中的应用回顾我们题目中的代码price_ratingsorted([(price,abs(price-x))forpriceinsorted_prices],keylambdaitem:item[1])这里我们创建了一个元组列表(price, abs(price - x))然后使用sorted()并指定keylambda item: item[1]即按照每个元组的第二个元素价格与心理价位的绝对差值进行排序。这样就实现了“最接近优先”的排序规则。5. 性能与稳定性sorted()使用的是 Timsort 算法时间复杂度为 O(n log n)。Timsort 是稳定的排序算法这意味着当两个元素比较相等时它们原有的相对顺序会被保留。这在多级排序中非常有用。6. 对复杂数据结构排序可以对字典、对象列表等进行排序。# 对字典按键或值排序my_dict{b:2,a:1,c:3}sorted_by_keysorted(my_dict.items())# [(a, 1), (b, 2), (c, 3)]sorted_by_valuesorted(my_dict.items(),keylambdax:x[1])# [(a, 1), (b, 2), (c, 3)]7. 总结表格特性sorted()list.sort()适用对象任何可迭代对象仅列表返回值新的排序列表None是否修改原数据否是排序稳定性是是掌握sorted()方法及其key参数的灵活使用是编写简洁高效 Python 代码的关键技能之一。
返回列表