第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)View Codereturn poorproduct a = input('請輸入一組數字,中間用逗號隔開:') nums1 = a.split(',') nums=[] for i in nums1: nums.append(int(i)) print(PoorProduct(nums))
第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))
如果刪除這段程式碼,輸出結果會有區別嗎?為什麼?