Python:基础入门练习171 - 180

# -*- coding: utf-8 -*-
# 171: 找出数组中的第一个回文字符串
# 给你一个字符串数组 words ,找出并返回数组中的 第一个回文字符串 。如果不存在满足要求的字符串,返回一个 空字符串 "" 。
# 回文字符串 的定义为:如果一个字符串正着读和反着读一样,那么该字符串就是一个 回文字符串 。
# 示例 1:
# 输入:words = ["abc","car","ada","racecar","cool"]
# 输出:"ada"
# 解释:第一个回文字符串是 "ada" 。
# 注意,"racecar" 也是回文字符串,但它不是第一个。
# 示例 2:
# 输入:words = ["notapalindrome","racecar"]
# 输出:"racecar"
# 解释:第一个也是唯一一个回文字符串是 "racecar" 。
# 示例 3:
# 输入:words = ["def","ghi"]
# 输出:""
# 解释:不存在回文字符串,所以返回一个空字符串。


class Solution171:
    def firstPalindrome(self, words) -> str:
        # 遍历。如果a=a[::-1]停止。否则,""
        result = ""
        for i in words:
            if i == i[::-1]:
                result = i
                break
        return result


s171 = Solution171()
r171 = s171.firstPalindrome(["notapalindrome", "racecar"])
print(r171)  # racecar


# 172: 根据给定数字划分数组
# 给你一个下标从 0 开始的整数数组 nums 和一个整数 pivot 。请你将 nums 重新排列,使得以下条件均成立:
# 所有小于 pivot 的元素都出现在所有大于 pivot 的元素 之前 。
# 所有等于 pivot 的元素都出现在小于和大于 pivot 的元素 中间 。
# 小于 pivot 的元素之间和大于 pivot 的元素之间的 相对顺序 不发生改变。
# 更正式的,考虑每一对 pi,pj ,pi 是初始时位置 i 元素的新位置,pj 是初始时位置 j 元素的新位置。对于小于 
# pivot 的元素,如果 i < j 且 nums[i] < pivot 和 nums[j] < pivot 都成立,那么 pi < pj 也成立。类似的,
# 对于大于 pivot 的元素,如果 i < j 且 nums[i] > pivot 和 nums[j] > pivot 都成立,那么 pi < pj 。
# 请你返回重新排列 nums 数组后的结果数组。
# 示例 1:
# 输入:nums = [9,12,5,10,14,3,10], pivot = 10
# 输出:[9,5,3,10,10,12,14]
# 解释:
# 元素 9 ,5 和 3 小于 pivot ,所以它们在数组的最左边。
# 元素 12 和 14 大于 pivot ,所以它们在数组的最右边。
# 小于 pivot 的元素的相对位置和大于 pivot 的元素的相对位置分别为 [9, 5, 3] 和 [12, 14] ,它们在结果数组中的相对顺序需要保留。
# 示例 2:
# 输入:nums = [-3,4,3,2], pivot = 2
# 输出:[-3,2,4,3]
# 解释:
# 元素 -3 小于 pivot ,所以在数组的最左边。
# 元素 4 和 3 大于 pivot ,所以它们在数组的最右边。
# 小于 pivot 的元素的相对位置和大于 pivot 的元素的相对位置分别为 [-3] 和 [4, 3] ,它们在结果数组中的相对顺序需要保留。


class Solution172:
    def pivotArray(self, nums, pivot: int):
        # 分三块。小于等于大于
        less_list = []
        eq_list = []
        more_list = []
        for i in nums:
            if i < pivot:
                less_list.append(i)
            elif i > pivot:
                more_list.append(i)
            else:
                eq_list.append(i)
        return less_list + eq_list + more_list


s172 = Solution172()
r172 = s172.pivotArray([9, 5, 3, 10, 10, 12, 14], 8)
print(r172)  # [5, 3, 9, 10, 10, 12, 14]


# 173: 交替合并字符串
# 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。
# 如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。
# 返回 合并后的字符串 。
# 示例 1:
# 输入:word1 = "abc", word2 = "pqr"
# 输出:"apbqcr"
# 解释:字符串合并情况如下所示:
# word1:  a   b   c
# word2:    p   q   r
# 合并后:  a p b q c r
# 示例 2:
# 输入:word1 = "ab", word2 = "pqrs"
# 输出:"apbqrs"
# 解释:注意,word2 比 word1 长,"rs" 需要追加到合并后字符串的末尾。
# word1:  a   b
# word2:    p   q   r   s
# 合并后:  a p b q   r   s
# 示例 3:
# 输入:word1 = "abcd", word2 = "pq"
# 输出:"apbqcd"
# 解释:注意,word1 比 word2 长,"cd" 需要追加到合并后字符串的末尾。
# word1:  a   b   c   d
# word2:    p   q
# 合并后:  a p b q c   d


class Solution173:
    def mergeAlternately(self, word1: str, word2: str) -> str:
        # 判断。如果A的长度大于等于B,则直接交替
        # 如果B的长度大于A,则A的长度+B的长度 + B[lenA:(B的长度- A的长度)]
        # 如果A的长度大于B。则A
        # 循环的长度在于谁更短。再判断剩余拼接
        w1_len = len(word1)
        w2_len = len(word2)

        number = w2_len if w1_len > w2_len else w1_len
        w = ""
        for i in range(number):
            w += str(word1[i])
            w += str(word2[i])

        if w1_len < w2_len:
            w += str(word2[w1_len:])
        else:
            w += str(word1[w2_len:])

        return w


s173 = Solution173()
r173 = s173.mergeAlternately("hello", "world")
print(r173)  # hweolrllod


# 174: 最富有客户的资产总量
# 给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。
# 返回最富有客户所拥有的 资产总量 。
# 客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。
# 示例 1:
# 输入:accounts = [[1,2,3],[3,2,1]]
# 输出:6
# 解释:
# 第 1 位客户的资产总量 = 1 + 2 + 3 = 6
# 第 2 位客户的资产总量 = 3 + 2 + 1 = 6
# 两位客户都是最富有的,资产总量都是 6 ,所以返回 6 。
# 示例 2:
# 输入:accounts = [[1,5],[7,3],[3,5]]
# 输出:10
# 解释:
# 第 1 位客户的资产总量 = 6
# 第 2 位客户的资产总量 = 10
# 第 3 位客户的资产总量 = 8
# 第 2 位客户是最富有的,资产总量是 10
# 示例 3:
# 输入:accounts = [[2,8,7],[7,1,3],[1,9,5]]
# 输出:17

class Solution174:
    def maximumWealth(self, accounts) -> int:
        result_list = []
        for each in accounts:
            result_list.append(sum(each))
        return max(result_list)


s174 = Solution174()
r174 = s174.maximumWealth([[1, 5], [7, 3], [3, 5]])
print(r174)  # 10


# 175: 剑指 Offer 64. 求1+2+…+n
# 求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
# 示例 1:
# 输入: n = 3
# 输出: 6
# 示例 2:
# 输入: n = 9
# 输出: 45


class Solution175:
    def sumNums(self, n: int) -> int:
        # from functools import reduce
        # return reduce(lambda x, y: x + y, range(1, n + 1))

        return sum(range(1, n + 1))


s175 = Solution175()
r175 = s175.sumNums(8)
print(r175)  # 36


# 176: 剑指 Offer II 079. 所有子集
# 给定一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
# 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
# 示例 1:
# 输入:nums = [1,2,3]
# 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
# 示例 2:
# 输入:nums = [0]
# 输出:[[],[0]]


class Solution176:
    def subsets(self, nums):
        new_list = [[], nums]
        import itertools
        for i in range(1, len(nums)):
            for j in itertools.combinations(nums, i):
                new_list.append(list(j))
        return new_list


s176 = Solution176()
r176 = s176.subsets([3, 4])
print(r176)  # [[], [3, 4], [3], [4]]


# 177: 拆分数位后四位数字的最小和
# 给你一个四位 正 整数 num 。请你使用 num 中的 数位 ,将 num 拆成两个新的整数 new1 和 new2 。
# new1 和 new2 中可以有 前导 0 ,且 num 中 所有 数位都必须使用。
# 比方说,给你 num = 2932 ,你拥有的数位包括:两个 2 ,一个 9 和一个 3 。一些可能的 [new1, new2] 
# 数对为 [22, 93],[23, 92],[223, 9] 和 [2, 329] 。
# 请你返回可以得到的 new1 和 new2 的 最小 和。
# 示例 1:
# 输入:num = 2932
# 输出:52
# 解释:可行的 [new1, new2] 数对为 [29, 23] ,[223, 9] 等等。
# 最小和为数对 [29, 23] 的和:29 + 23 = 52 。
# 示例 2:
# 输入:num = 4009
# 输出:13
# 解释:可行的 [new1, new2] 数对为 [0, 49] ,[490, 0] 等等。
# 最小和为数对 [4, 9] 的和:4 + 9 = 13 。


class Solution177:
    def minimumSum(self, num: int) -> int:
        # 转成列表。
        # 排序+ 13、24最小
        new = [i for i in str(num)]
        new.sort()
        one_number = int(new[0] + new[2])
        two_number = int(new[1] + new[3])

        return one_number + two_number


s177 = Solution177()
r177 = s177.minimumSum(5927)
print(r177)  # 86


# 178: 可以形成最大正方形的矩形数目
# 给你一个数组 rectangles ,其中 rectangles[i] = [li, wi] 表示第 i 个矩形的长度为 li 、宽度为 wi 。
# 如果存在 k 同时满足 k <= li 和 k <= wi ,就可以将第 i 个矩形切成边长为 k 的正方形。
# 例如,矩形 [4,6] 可以切成边长最大为 4 的正方形。
# 设 maxLen 为可以从矩形数组 rectangles 切分得到的 最大正方形 的边长。
# 请你统计有多少个矩形能够切出边长为 maxLen 的正方形,并返回矩形 数目 。
# 示例 1:
# 输入:rectangles = [[5,8],[3,9],[5,12],[16,5]]
# 输出:3
# 解释:能从每个矩形中切出的最大正方形边长分别是 [5,3,5,5] 。
# 最大正方形的边长为 5 ,可以由 3 个矩形切分得到。
# 示例 2:
# 输入:rectangles = [[2,3],[3,7],[4,3],[3,7]]
# 输出:3


class Solution178:
    def countGoodRectangles(self, rectangles) -> int:
        # 遍历数组,找到最小的放入一个列表
        # 转 元素对应个数,排序保证最大在前
        # 找出最大的长度。
        temp = [min(i) for i in rectangles]
        import collections
        r = [(k, v) for k, v in collections.Counter(temp).items()]
        r.sort(reverse=True)
        return r[0][1]


s178 = Solution178()
r178 = s178.countGoodRectangles([[2, 3], [3, 7], [4, 3], [3, 7]])
print(r178)  # 3


# 179: 统计是给定字符串前缀的字符串数目
# 给你一个字符串数组 words 和一个字符串 s ,其中 words[i] 和 s 只包含 小写英文字母 。
# 请你返回 words 中是字符串 s 前缀 的 字符串数目 。
# 一个字符串的 前缀 是出现在字符串开头的子字符串。子字符串 是一个字符串中的连续一段字符序列。
# 示例 1:
# 输入:words = ["a","b","c","ab","bc","abc"], s = "abc"
# 输出:3
# 解释:
# words 中是 s = "abc" 前缀的字符串为:
# "a" ,"ab" 和 "abc" 。
# 所以 words 中是字符串 s 前缀的字符串数目为 3 。
# 示例 2:
# 输入:words = ["a","a"], s = "aa"
# 输出:2
# 解释:
# 两个字符串都是 s 的前缀。
# 注意,相同的字符串可能在 words 中出现多次,它们应该被计数多次。


class Solution179:
    def countPrefixes(self, words, s: str) -> int:
        # 遍历。如果startswith 次数+1
        return sum([1 for i in words if s.startswith(i)])


s179 = Solution179()
r179 = s179.countPrefixes(["he", "h", "o", "a"], "hello world")
print(r179)  # 2


# 180: 将找到的值乘以 2
# 给你一个整数数组 nums ,另给你一个整数 original ,这是需要在 nums 中搜索的第一个数字。
# 接下来,你需要按下述步骤操作:
# 如果在 nums 中找到 original ,将 original 乘以 2 ,得到新 original(即,令 original = 2 * original)。
# 否则,停止这一过程。
# 只要能在数组中找到新 original ,就对新 original 继续 重复 这一过程。
# 返回 original 的 最终 值。
# 示例 1:
# 输入:nums = [5,3,6,1,12], original = 3
# 输出:24
# 解释:
# - 3 能在 nums 中找到。3 * 2 = 6 。
# - 6 能在 nums 中找到。6 * 2 = 12 。
# - 12 能在 nums 中找到。12 * 2 = 24 。
# - 24 不能在 nums 中找到。因此,返回 24 。
# 示例 2:
# 输入:nums = [2,7,9], original = 4
# 输出:4
# 解释:
# - 4 不能在 nums 中找到。因此,返回 4 。


class Solution180:
    def findFinalValue(self, nums, original: int) -> int:
        result = original
        while True:
            if original in nums:
                original *= 2
                result = original
            else:
                break
        return result


s180 = Solution180()
r180 = s180.findFinalValue([5, 3, 6, 1, 12], 3)
print(r180)  # 24

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值