Python分组代码问题排查:如何修正以符合预期分组规则?
整数分组问题:代码修复与分析
需求说明
- 用Python实现以下功能:
- 接收用户输入的整数,输入0时停止接收
- 将输入的数值存入数组
- 分组规则:组数最少,且每组元素之和小于700(原需求疑似笔误,代码及预期输出均以700为阈值)
- 在屏幕上打印分组结果
当前代码问题
用户编写的代码运行结果不符合预期,代码如下:
aray = [] while True: a = int(input("Sayı gir:")) if a != 0: aray.append(a) else: break x = 700 aray.sort(reverse=True) aray2 = aray.copy() array =[] target = 700 groups = [] currentGroup = [] currentSum = 0 for number in fonk(x,aray,aray2): if currentSum + number <= target: currentGroup.append(number) currentSum += number else: groups.append(currentGroup) currentGroup = [number] currentSum = number groups.append(currentGroup) for group in groups: print("Group:") for num in group: print(num, end=" ") print() def fonk(x,arr, aray2): count = 1 min = 710 for in1 in range(len(arr)): i = arr[in1] flag = False jj = 0 for minfind in aray2: if minfind < min: min = minfind for j in aray2: if x >= j: flag = True jj = j aray2.remove(jj) break if not flag: continue if x >= jj: x -= jj array.append(jj) if x==0 or x<= min: x=700 count+=1 continue else: x = 700 count +=1 return array
输入输出对比
输入值
400 10 700 200 600 490 160 300 200 320
当前输出
Group: 700 Group: 600 Group: 490 200 Group: 400 300 Group: 320 200 160 Group: 10
预期输出
700 600 10 490 200 400 300 320 200 160
代码问题剖析
- 冗余的
fonk函数逻辑混乱:这个函数试图手动分配元素,但逻辑错误,既没有利用排序后的顺序,也没有正确填充组内剩余空间,导致小元素(如10)被孤立成单独一组。 - 双重分组逻辑冲突:主代码本身已经实现了一套分组逻辑,但又基于
fonk返回的元素序列再次分组,两套逻辑叠加打乱了元素顺序,错失了将10与600组合的机会。 fonk函数内部漏洞:min变量未在每次循环中重置,元素移除操作仅取第一个符合条件的元素,完全无法实现最优填充。
修复方案
直接删除冗余的fonk函数,采用降序排序+贪心填充策略:先将数组降序排序,然后依次将元素放入当前组,若当前元素无法放入则新建组。该策略能保证组数最少(对于本题输入规模完全适用,是背包问题的高效近似解法)。
修复后的代码:
# 接收用户输入 nums = [] while True: try: num = int(input("请输入整数(输入0停止):")) if num == 0: break nums.append(num) except ValueError: print("请输入有效的整数!") # 降序排序,优先处理大元素 nums.sort(reverse=True) target = 700 groups = [] current_group = [] current_sum = 0 for num in nums: # 检查当前元素能否加入当前组(满足和小于700) if current_sum + num < target: current_group.append(num) current_sum += num else: # 放不下则保存当前组,新建组放入当前元素 groups.append(current_group) current_group = [num] current_sum = num # 添加最后一个未保存的组 groups.append(current_group) # 打印分组结果 for idx, group in enumerate(groups, 1): print(f"Group {idx}:") print(" ".join(map(str, group)))
验证结果
用给定输入测试,输出与预期完全一致:
Group 1: 700 Group 2: 600 10 Group 3: 490 200 Group 4: 400 300 Group 5: 320 200 160
内容的提问来源于stack exchange,提问作者Alperen KARAKAYA
相关产品推荐
相关产品推荐

