题目
问题描述:
给你一个整数数组 nums,返回数组 answer,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: 输出:
[1, 2, 3, 4,] [24, 12, 8, 6]
[-1, 1, 0, -3, 3] [0, 0, 9, 0, 0]
解答
一共提供了多种实现要求的自定义函数。
'''
给你一个整数数组 nums,返回数组 answer,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
输入: 输出:
[1, 2, 3, 4,] [24, 12, 8, 6]
[-1, 1, 0, -3, 3] [0, 0, 9, 0, 0]
'''
'''导入需要使用的模块'''
import functools
import math
import numpy as np # 导入numpy库,用于求解乘积
'''方法一:循环求解'''
def first_num(nums):
result_list = [] # 创建一个空列表,用来存放结果
length = len(nums) # 求出数组的长度
# 确定循环次数
for i in range(length):
# 计算乘积
result = 1 # 乘积初始化为1
for n in nums:
if n != nums[i]: # 去掉当前元素,计算乘积
result *= n # 更新乘积
result_list.append(result) # 将结果添加到列表中
return result_list
'''方法二:方法一通过列表推导式'''
def second_num(nums):
# 利用列表推导式,计算除当前元素之外的其他元素的乘积
return [
int( # 转换为整型
functools.reduce(lambda x, y: x * y, [n for n in nums if n != num])
# 使用lambda函数,计算乘积
)
for num in nums # 遍历数组,计算乘积
]
'''方法三:将这个元素去掉求其他的积'''
def third_num(nums):
last_num = [] # 创建用来存放结果的列表
for i in range(len(nums)):
new_nums = nums.copy()
del new_nums[i]
result = 1 # 乘积初始化为1
for num in new_nums:
result *= num # 更新乘积
last_num.append(result)
return last_num # 返回最终结果列表
'''方法四:利用切片跳过这个元素'''
def forth_num(nums):
last_num = [] # 创建用来存放结果的列表
for i in range(len(nums)): # 设置循环结果
'''通过切片,取出前面和后面的元素,组合成为一个新的列表'''
new_nums = nums[:i] + nums[i + 1:]
result = 1
for num in new_nums:
result *= num
last_num.append(result)
return last_num
'''方法五:利用math库求解'''
def fifth_num(nums):
last_num = []
for i in range(len(nums)):
new_nums = nums.copy()
del new_nums[i]
last_num.append(int(math.prod(new_nums))) # 利用math库的prod()函数求解乘积,并转换为整数
return last_num
'''方法六:切片+math库'''
def sixth_num(nums):
last_num = [] # 创建用来存放结果的列表
for i in range(len(nums)): # 设置循环结果
'''通过切片,取出前面和后面的元素,组合成为一个新的列表'''
new_nums = nums[:i] + nums[i + 1:]
last_num.append(int(math.prod(new_nums))) # 利用math库的prod()函数求解乘积,并转换为整数
return last_num # 返回最终结果列表
'''方法七:利用numpy库求解'''
def seventh_num(nums):
# 将列表转换为numpy数组
nums = np.array(nums)
last_num = [] # 创建一个列表,用来存放结果,也就是最后打印的列表
for i in range(len(nums)): # 确定循环次数,与上面的方法此处一样
new_nums = np.delete(nums, i) # 去掉第i个元素,得到新的列表
result = np.prod(new_nums) # 计算乘积,利用numpy库的prod()函数
last_num.append(int(result)) # 将结果转换为整数,添加到last_num列表中
return last_num # 返回最后的结果列表
'''方法八:前缀积和后缀积'''
def eighth_num(nums):
length = len(nums) # 数组长度
ans = [1] * length # 创建一个长度为数组长度的列表,用来存放结果
pre = 1 # 从左向右遍历,初始前缀设置为1
for i in range(length): # 设置求前缀积的循环
ans[i] = pre # 前缀积赋值给列表的当前位置
pre *= nums[i] # 更新前缀积
post = 1 # 从右向左遍历,初始后缀设置为1
for i in range(length - 1, -1, -1): # 设置求,后缀积循环
ans[i] *= post # 此时ans中已经包含了前缀积,只需要更新后缀积即可
post *= nums[i]
return ans # 返回最终结果列表
'''测试函数'''
if __name__ == '__main__':
nums1 = [1, 2, 3, 4]
nums2 = [-1, 1, 0, -3, 3]
print("第一个测试例子nums1,各种函数运行结果如下")
print(first_num(nums1))
print(second_num(nums1))
print(third_num(nums1))
print(forth_num(nums1))
print(fifth_num(nums1))
print(sixth_num(nums1))
print(seventh_num(nums1))
print(eighth_num(nums1))
print("第二个测试例子nums2,各种函数运行结果如下")
print(first_num(nums2))
print(second_num(nums2))
print(third_num(nums2))
print(forth_num(nums2))
print(fifth_num(nums2))
print(sixth_num(nums2))
print(seventh_num(nums2))
print(eighth_num(nums2))