数组最大乘积求解:现有Python代码未通过部分边界用例,求排查
你的代码遗漏的边界场景与修正方案
你的核心思路方向是对的,但忽略了几个关键的边界情况,导致部分测试用例失败:
遗漏的问题点
完全忽略了0的影响
当数组包含0时,0可能成为最大乘积的候选值(比如数组[-1, 0],正确结果是0,但你的代码会返回-1)。另外,当数组全是0时,你的代码会错误返回1(因为positive_product和negative_product初始都是1,相乘后还是1)。负数数量为奇数且仅1个时的错误处理
比如数组[-1, 0, 2],你的代码会把负数-1乘入结果,得到-2,但实际最大乘积应该是2(只取正数)。这种情况下,你应该放弃这个唯一的负数,而不是强行乘入。初始值设置不合理
positive_product和negative_product初始设为1,当数组中没有正数或处理后的负数时,这个1会干扰结果(比如全0数组)。返回值类型错误
题目要求返回数值(如60),但你的代码返回字符串类型(如"60"),这也会导致测试用例不通过。
修正后的代码与思路
针对上述问题,调整后的思路如下:
- 先处理数组长度为1的特殊情况,直接返回该元素;
- 分离正数、负数,标记是否存在0;
- 若负数数量为奇数,去掉绝对值最小的负数(即排序后的最后一个元素);
- 计算正数与处理后负数的乘积,同时把0作为候选值(如果存在);
- 最终取所有候选值中的最大值。
修正后的代码:
def largest_product(arr): if len(arr) == 1: return arr[0] positives = [n for n in arr if n > 0] negatives = sorted([n for n in arr if n < 0]) has_zero = 0 in arr # 奇数个负数时,去掉绝对值最小的那个(排序后的最后一个元素) if len(negatives) % 2 != 0: negatives.pop() # 计算有效乘积(避免初始值1干扰) product = None for num in positives + negatives: if product is None: product = num else: product *= num # 收集所有候选值 candidates = [] if product is not None: candidates.append(product) if has_zero: candidates.append(0) return max(candidates)
测试验证
- 测试
[-2, -3, 4, -5]→ 返回60(正确) - 测试
[-1, 0]→ 返回0(正确) - 测试
[-1, 0, 2]→ 返回2(正确) - 测试
[0, 0, 0]→ 返回0(正确) - 测试
[-5, -3, -2]→ 返回15(正确)
内容的提问来源于stack exchange,提问作者Abhinav
相关产品推荐
相关产品推荐

