求解除自身外数组元素乘积时遇List assignment index out of range错误求助
解决“除自身以外数组的乘积”问题及代码错误修复
问题描述
给定整数数组nums,返回一个answer数组,其中answer[i]等于nums中除nums[i]之外所有元素的乘积。
示例1:
输入:nums = [1,2,3,4]
输出:[24,12,8,6]示例2:
输入:nums = [-1,1,0,-3,3]
输出:[0,0,9,0,0]
你的代码错误分析
- 索引越界错误原因:你初始化的
array是空列表,array[j]=mul试图给不存在的索引位置赋值,这直接触发了list assignment index out of range错误。 - 算法逻辑缺陷:
- 用总乘积除以当前元素的思路不成立,当数组包含0时会触发除以0的运行时错误(比如示例2的场景);
- 你的循环逻辑错误,
mul=m/i在每次循环中都会被覆盖,最终mul仅等于总乘积除以最后一个元素的值,无法生成每个位置对应的正确结果。
正确实现方案
方案1:左右乘积数组(直观易理解)
通过分别计算每个元素左侧、右侧所有元素的乘积,再将两者相乘得到最终结果:
def product_except_self(nums): n = len(nums) left_products = [1] * n right_products = [1] * n result = [1] * n # 计算每个元素左侧的乘积 for i in range(1, n): left_products[i] = left_products[i-1] * nums[i-1] # 计算每个元素右侧的乘积 for i in range(n-2, -1, -1): right_products[i] = right_products[i+1] * nums[i+1] # 左右乘积相乘得到结果 for i in range(n): result[i] = left_products[i] * right_products[i] return result # 保留你的输入函数 def inputArray(): lst = [] n = int(input("Enter number of elements : ")) for _ in range(n): ele = int(input()) lst.append(ele) print(lst) return lst # 运行测试 nums = inputArray() print(product_except_self(nums))
方案2:空间优化版(O(1)额外空间)
直接在结果数组上先计算左侧乘积,再反向遍历计算右侧乘积并更新结果,无需额外的左右乘积数组:
def product_except_self(nums): n = len(nums) result = [1] * n # 先计算左侧乘积存入result for i in range(1, n): result[i] = result[i-1] * nums[i-1] # 反向遍历,计算右侧乘积并直接更新结果 right_product = 1 for i in range(n-1, -1, -1): result[i] *= right_product right_product *= nums[i] return result # 输入函数不变 def inputArray(): lst = [] n = int(input("Enter number of elements : ")) for _ in range(n): ele = int(input()) lst.append(ele) print(lst) return lst nums = inputArray() print(product_except_self(nums))
内容的提问来源于stack exchange,提问作者Unai Granados Ormaetxea
相关产品推荐
相关产品推荐

