# -*- coding: utf-8 -*-
# 061: 两个数对之间的最大乘积差
# 两个数对 (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]) 之间的 乘积差 取到 最大值 。
# 返回以这种方式取得的乘积差中的 最大值 。
# 示例 1:
# 输入:nums = [5,6,2,7,4]
# 输出:34
# 解释:可以选出下标为 1 和 3 的元素构成第一个数对 (6, 7) 以及下标 2 和 4 构成第二个数对 (2, 4)
# 乘积差是 (6 * 7) - (2 * 4) = 34
#
# 示例 2:
# 输入:nums = [4,2,5,9,7,4,8]
# 输出:64
# 解释:可以选出下标为 3 和 6 的元素构成第一个数对 (9, 8) 以及下标 1 和 5 构成第二个数对 (2, 4)
# 乘积差是 (9 * 8) - (2 * 4) = 64
class Solution061: # 思路大乘大,减去, 小乘小
def maxProductDifference(self, nums: list[int]) -> int:
nums.sort()
return nums[-1] * nums[-2] - nums[0] * nums[1]
s061 = Solution061()
r061 = s061.maxProductDifference([4, 2, 5, 9, 7, 4, 8])
print(r061) # 64
# 062: 字符串中的第一个唯一字符
# 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
# 示例:
# s = "leetcode"
# 返回 0
#
# s = "loveleetcode"
# 返回 2
class Solution062:
def firstUniqChar(self, s: str) -> int:
num = -1
for i, v in enumerate(s):
if s.count(v) == 1:
num = i
break
return num
s062 = Solution062()
r062 = s062.firstUniqChar("loveleetcode")
print(r062) # 2
# 063: 有多少小于当前数字的数字
# 给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
# 换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。
# 以数组形式返回答案。
# 示例 1:
# 输入:nums = [8,1,2,2,3]
# 输出:[4,0,1,1,3]
# 解释:
# 对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。
# 对于 nums[1]=1 不存在比它小的数字。
# 对于 nums[2]=2 存在一个比它小的数字:(1)。
# 对于 nums[3]=2 存在一个比它小的数字:(1)。
# 对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。
#
# 示例 2:
# 输入:nums = [6,5,4,8]
# 输出:[2,1,0,3]
#
# 示例 3:
# 输入:nums = [7,7,7,7]
# 输出:[0,0,0,0]
class Solution063:
def smallerNumbersThanCurrent(self, nums: list[int]) -> list[int]:
count = len(nums)
s_list = []
for i in range(count):
s_num = nums[i]
inner = 0
for j in range(count):
if nums[j] < s_num:
inner += 1
s_list.append(inner)
return s_list
s063 = Solution063()
r063 = s063.smallerNumbersThanCurrent([5, 0, 1])
print(r063) # [2, 0, 1]
# 064: 随机数索引
# 给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。您可以假设给定的数字一定存在于数组中。
# 注意:
# 数组大小可能非常大。使用太多额外空间的解决方案将不会通过测试。
# 示例:
#
# int[] nums = new int[] {1,2,3,3,3};
# Solution solution = new Solution(nums);
#
# // pick(3) 应该返回索引 2,3 或者 4。每个索引的返回概率应该相等。
# solution.pick(3);
#
# // pick(1) 应该返回 0。因为只有nums[0]等于1。
# solution.pick(1);
class Solution064:
def __init__(self, nums: list[int]):
self.nums = nums
def pick(self, target: int) -> int:
count_value = self.nums.count(target)
if count_value == 1:
return self.nums.index(target)
else:
import random
new_list = []
for i, v in enumerate(self.nums):
if v == target:
new_list.append(i)
return random.choice(new_list)
s064 = Solution064([1, 2, 3, 3, 3])
r064 = s064.pick(3)
print(r064) # index 2,3,4中的一个。
# 065: 一维数组的动态和
# 给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。
# 请返回 nums 的动态和。
# 示例 1:
# 输入:nums = [1,2,3,4]
# 输出:[1,3,6,10]
# 解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。
#
# 示例 2:
# 输入:nums = [1,1,1,1,1]
# 输出:[1,2,3,4,5]
# 解释:动态和计算过程为 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1] 。
#
# 示例 3:
# 输入:nums = [3,1,2,10,1]
# 输出:[3,4,6,16,17]
class Solution065:
def runningSum(self, nums: list[int]) -> list[int]:
new_list = []
init_sum = 0
for i in nums:
init_sum += i
new_list.append(init_sum)
return new_list
s065 = Solution065()
r065 = s065.runningSum([1, 2, 3, 4])
print(r065) # [1, 3, 6, 10]
微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!