# 第30期-寻求两个数对之间的最大乘积

Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。

# 1 问题描述

两个数对 (a, b) 和 (c, d) 之间的 乘积差 定义为 (a * b) - (c * d) 。
例如,(5, 6) 和 (2, 7) 之间的乘积差是 (5 * 6) - (2 * 7) = 16 。
给你一个整数数组 nums ,选出四个 不同的 下标 w、x、y 和 z ,使数对 (nums[w], nums[x]) 和 (nums[y], nums[z]) 之间的 乘积差 取到 最大值 。
返回以这种方式取得的乘积差中的 最大值 。
输入:nums = [5,6,2,7,4]
输出:34
解释:可以选出下标为 1 和 3 的元素构成第一个数对 (6, 7) 以及下标 2 和 4 构成第二个数对 (2, 4)
乘积差是 (6 * 7) - (2 * 4) = 34

# 2 解题思路

  • 输入一组数据,可以考虑使用map函数,但需要定义的变量过多,可以考虑使用split函数形成列表
  • 取最大值与次大值,可以考虑使用remove函数去除列表元素
  • 可以考虑使用sort函数排列列表

# 3 解题方法

# 方法一

def PoorProduct(nums):
    max_1 = max(nums)
    nums.remove(max_1)
    max_2 = max(nums)
    min_1 = min(nums)
    nums.remove(min_1)
    min_2 = min(nums)
    poorproduct = int(max_1) * int(max_2) - int(min_1) * int(min_2)
    return poorproduct

a = input('请输入一组数字,中间用逗号隔开:')
nums1 = a.split(',')
nums=[]
for i in nums1:
    nums.append(int(i))
print(PoorProduct(nums))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

第1行: 定义函数PoorProduct,用于返回最大乘积差
第2-7行: 使用max与min函数找出数组中的最大值、次大值、最小值以及次小值,并分别赋值给对应变量
第8-9行: 计算最大乘积差并返回给函数
第11行: 使用input函数输入数组并提示用户中间用逗号隔开
第12行: 使用split函数,将逗号前后的字符串分别列出并作为元素放进列表中
第13-15行: 将列表num1中的元素全部转化为整数类型再存到新的列表num中
第16行: 计算数组最大乘积差

# 方法二

a = input('请输入一组数字,中间用逗号隔开:')
nums1 = a.split(',')
nums=[]
for i in nums1:
    nums.append(int(i))
nums.sort()
print(nums[-1]*nums[-2]-nums[0]*nums[1])
1
2
3
4
5
6
7

第1行: 使用input函数输入数组并提示用户中间用逗号隔开
第2行: 使用split函数,将逗号前后的字符串分别列出并作为元素放进列表中
第3-5行: 将列表num1中的元素全部转化为整数类型再存到新的列表num中
第6行: 使用sort函数将列表中的整数从小到大重新排列
第7行: 打印数组最大乘积差

代码运行结果为:
image.png

这里用到了remove函数和split函数,简单讲解下这两个函数:
remove()函数
remove() 函数用于移除列表中某个值的第一个匹配项。
语法:
list.remove(obj)
参数说明:
obj -- 列表中要移除的对象。

例如:aList = [123, 'xyz', 'zara', 'abc', 'xyz'];
aList.remove('xyz');
print(aList):[123, 'zara', 'abc', 'xyz']
默认删除列表中与参数对应的第一个元素


split()函数
split()函数可以将一个字符串分裂成多个字符串组成的列表。
语法:
str.split(sep, maxsplit).
参数说明:
sep 是分割符,不写分割符时表示所有的空字符,包括空格、换行(\n)、制表符(\t)等,有分隔符时,以该分隔符进行分割。
maxsplit是分割次数。

例如:L = '100 200 300\n400\t500'
print(L.split())
执行结果:['100', '200', '300', '400', '500']
print(L.split(' ', 1))
执行结果:['100', '200 300\n400\t500']

# 小思考

为什么方法一与方法二都需要下面这段代码?

nums=[]
for i in nums1:
    nums.append(int(i))
1
2
3

如果删除这段代码,输出结果会有区别吗?为什么?

# 4 视频解析

高清视频讲解,请查看AI大学堂Python基础实战100例 (opens new window)
关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
AI大学堂公众号.png

更新于: 12/28/2021, 7:43:14 AM