python:基础入门练习061 - 065


# -*- 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]

微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容