1. 程式人生 > 其它 >第30期-尋求兩個數對之間的最大乘積

第30期-尋求兩個數對之間的最大乘積

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))
View Code

第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行:使用input函式輸入陣列並提示使用者中間用逗號隔開
第2行:使用split函式,將逗號前後的字串分別列出並作為元素放進列表中
第3-5行:將列表num1中的元素全部轉化為整數型別再存到新的列表num中
第6行:使用sort函式將列表中的整數從小到大重新排列
第7行:列印陣列最大乘積差

程式碼執行結果為:

這裡用到了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))

如果刪除這段程式碼,輸出結果會有區別嗎?為什麼?