Python练习题,求列表中自生以外元素的乘积

题目

问题描述:

给你一个整数数组 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))


  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值