Codefights题目“Digit Difference Sort”求解咨询
解决Codefights的Digit Difference Sort任务
我来帮你搞定这个排序任务~先把问题再理清楚:
给定一个整数数组,按以下规则排序:
- 优先按元素的最大数字与最小数字的差值从小到大排列
- 若两个元素的差值相同,原数组中索引更大的元素排在前面
举个题目里的例子:
输入 a = [152, 23, 7, 887, 243],各元素的差值分别是:
- 152:5-1=4
- 23:3-2=1
- 7:7-7=0
- 887:8-7=1
- 243:4-2=2
按照规则排序后输出就是[7, 887, 23, 243, 152]
解题思路
核心就是给每个元素绑定两个关键信息:它的数字差值,以及它在原数组里的索引。排序的时候先按差值升序排,差值一样的话就按索引降序排(因为索引大的要靠前)。
Python 实现代码
def digitDifferenceSort(a): # 辅助函数:计算单个数字的最大最小差值 def calculate_difference(num): digits = [int(d) for d in str(num)] return max(digits) - min(digits) # 把每个元素和它的差值、原索引打包成元组 elements_with_info = [(num, calculate_difference(num), idx) for idx, num in enumerate(a)] # 自定义排序规则:先按差值升序,再按索引的负值升序(等价于索引降序) elements_with_info.sort(key=lambda x: (x[1], -x[2])) # 提取排序后的数字列表 return [item[0] for item in elements_with_info] # 测试示例 test_a = [152, 23, 7, 887, 243] print(digitDifferenceSort(test_a)) # 输出: [7, 887, 23, 243, 152]
代码解释
calculate_difference函数:把数字转成字符串后拆成单个数字的整数列表,直接用max和min计算差值,简单直观。- 打包元组:用
enumerate拿到原索引,这样排序时能记住每个元素的原始位置。 - 排序逻辑:
sort方法的key参数里,第一个元素是差值(升序),第二个是索引的负值——因为默认排序是升序,负索引大的元素会排在前面,刚好满足“索引大的优先”的要求。 - 最后只提取排序后的数字,就是我们要的结果啦~
内容的提问来源于stack exchange,提问作者Glitch
相关产品推荐
相关产品推荐

