如何实现优先用3的数字分解及优化配送最少趟数函数
两个关联技术问题的解决方案
一、数字分解为3和2的倍数之和(优先使用3)
需求:编写函数将大于1的数字分解为尽可能多的3与2的倍数之和,返回格式如3:3, 2:1(对应3×3+2×1=11)。
实现代码
def get_components(n): f3 = 0 f2 = 0 # 当n除以3余1时,减少1个3,替换为2个2(3+1=4=2×2) if n % 3 == 1: f3 = (n // 3) - 1 f2 = 2 # 当n除以3余2时,保留现有3的数量,补充1个2 elif n % 3 == 2: f3 = n // 3 f2 = 1 # 能被3整除的情况,全用3 else: f3 = n // 3 f2 = 0 return f"3:{f3}, 2:{f2}"
逻辑说明
- 核心原则是优先使用3,以最大化3的数量
- 若
n%3=1:直接用3会剩余1,因此减少1个3,剩余的数值恰好是4,可拆为2个2 - 若
n%3=2:剩余的2直接用1个2即可 - 能被3整除时,全部使用3
二、优化getMinimumTrips配送趟数计算函数
原问题缺陷
原函数未处理包裹数量既不能被2也不能被3整除的情况(如5、7等),需结合上述数字分解逻辑完善,以计算最少配送趟数。规则:每趟可配送2个或3个同重量包裹,若存在仅1个的包裹则返回-1。
优化后代码
from collections import Counter def getMinimumTrips(weights): weights_counted = Counter(weights) minimum_trips = 0 for count in weights_counted.values(): # 单个包裹无法完成配送,直接返回-1 if count == 1: return -1 # 根据数量计算最少趟数,优先用3个一趟的方式 if count % 3 == 0: minimum_trips += count // 3 elif count % 3 == 1: # 余1时,拆为2个2趟 + 剩余数量的3趟 minimum_trips += (count - 4) // 3 + 2 elif count % 3 == 2: # 余2时,加1个2趟 + 现有数量的3趟 minimum_trips += count // 3 + 1 return minimum_trips # 测试示例 print(getMinimumTrips([2, 4, 6, 6, 4, 2, 4])) # 输出:3(重量2有2个→1趟;重量4有3个→1趟;重量6有2个→1趟)
优化说明
- 遍历每个重量对应的包裹数量,若数量为1直接返回-1
- 针对不同余数情况计算最少趟数:
- 能被3整除:直接除以3得到趟数
- 余1时:将4个包裹拆为2趟2个的,剩余数量用3个一趟的方式
- 余2时:用1趟2个的,剩余数量用3个一趟的方式
- 始终优先使用3个一趟的配送方式,保证总趟数最少
内容的提问来源于stack exchange,提问作者TS01
相关产品推荐
相关产品推荐

