美文网首页
Python:基础入门练习131 - 140

Python:基础入门练习131 - 140

作者: 玩转测试开发 | 来源:发表于2021-12-14 23:52 被阅读0次
# -*- coding: utf-8 -*-
# 131: 验证回文串
# 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
# 说明:本题中,我们将空字符串定义为有效的回文串。
# 示例 1:
# 输入: "A man, a plan, a canal: Panama"
# 输出: true
# 解释:"amanaplanacanalpanama" 是回文串
# 示例 2:
# 输入: "race a car"
# 输出: false
# 解释:"raceacar" 不是回文串


class Solution131:
    def isPalindrome(self, s: str) -> bool:
        res = []
        for i in s:
            # isalnum()方法检测字符串是否由字母和数字组成。
            if i.isalnum():
                res.append(i.lower())
        return res == res[::-1]


s131 = Solution131()
r131 = s131.isPalindrome("hi Tom, mot ih")
print(r131)  # True


# 132: 斐波那契数
# 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,
# 后面的每一项数字都是前面两项数字的和。也就是:
# F(0) = 0,F(1) = 1
# F(n) = F(n - 1) + F(n - 2),其中 n > 1
# 给你 n ,请计算 F(n) 。
# 示例 1:
# 输入:2
# 输出:1
# 解释:F(2) = F(1) + F(0) = 1 + 0 = 1
# 示例 2:
# 输入:3
# 输出:2
# 解释:F(3) = F(2) + F(1) = 1 + 1 = 2


class Solution132:
    def fib(self, n: int) -> int:
        if n <= 1:
            return n
        else:
            return self.fib(n - 1) + self.fib(n - 2)


s132 = Solution132()
r132 = s132.fib(7)
print(r132)  # 13


# 133: 至少在两个数组中出现的值
# 给你三个整数数组 nums1、nums2 和 nums3 ,请你构造并返回一个 与这三个数组都不同的 数组,
# 且由 至少 在 两个 数组中出现的所有值组成。数组中的元素可以按 任意 顺序排列。
# 示例 1:
# 输入:nums1 = [1,1,3,2], nums2 = [2,3], nums3 = [3]
# 输出:[3,2]
# 解释:至少在两个数组中出现的所有值为:
# - 3 ,在全部三个数组中都出现过。
# - 2 ,在数组 nums1 和 nums2 中出现过。
#
# 示例 2:
# 输入:nums1 = [3,1], nums2 = [2,3], nums3 = [1,2]
# 输出:[2,3,1]
# 解释:至少在两个数组中出现的所有值为:
# - 2 ,在数组 nums2 和 nums3 中出现过。
# - 3 ,在数组 nums1 和 nums2 中出现过。
# - 1 ,在数组 nums1 和 nums3 中出现过。
#
# 示例 3:
# 输入:nums1 = [1,2,2], nums2 = [4,3,3], nums3 = [5]
# 输出:[]
# 解释:不存在至少在两个数组中出现的值。


class Solution133:
    def twoOutOfThree(self, nums1: list[int], nums2: list[int], nums3: list[int]) -> list[int]:
        new_list = []

        for i in nums1:
            count = 0
            if i in nums2 or i in nums3:
                new_list.append(i)

        for i in nums2:
            count = 0
            if i in nums1 or i in nums3:
                new_list.append(i)

        for i in nums3:
            count = 0
            if i in nums1 or i in nums2:
                new_list.append(i)

        return list(set(new_list))


s133 = Solution133()
r133 = s133.twoOutOfThree([1, 2], [1, 3], [2, 3])
print(r133)  # [1, 2, 3]


# 134: 日期之间隔几天
# 请你编写一个程序来计算两个日期之间隔了多少天。
# 日期以字符串形式给出,格式为 YYYY-MM-DD,如示例所示。
# 示例 1:
# 输入:date1 = "2019-06-29", date2 = "2019-06-30"
# 输出:1
#
# 示例 2:
# 输入:date1 = "2020-01-15", date2 = "2019-12-31"
# 输出:15


class Solution134:
    def daysBetweenDates(self, date1: str, date2: str) -> int:
        from datetime import datetime
        y1, m1, d1 = date1.split("-")
        y2, m2, d2 = date2.split("-")
        cur_day = datetime(int(y1), int(m1), int(d1))
        next_day = datetime(int(y2), int(m2), int(d2))
        return abs((next_day - cur_day).days)


s134 = Solution134()
r134 = s134.daysBetweenDates("2021-12-14", "2008-08-08")
print(r134)  # 4876


# 135: 剑指 Offer 45. 把数组排成最小的数
# 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个
# 示例 1:
# 输入: [10,2]
# 输出: "102"
#
# 示例 2:
# 输入: [3,30,34,5,9]
# 输出: "3033459"


class Solution135:
    def minNumber(self, nums: list[int]) -> str:
        import functools
        def sort_rule(x, y):
            a, b = x + y, y + x
            if a > b:
                return 1
            elif a < b:
                return -1
            else:
                return 0

        strs = [str(num) for num in nums]
        strs.sort(key=functools.cmp_to_key(sort_rule))
        return ''.join(strs)


s135 = Solution135()
r135 = s135.minNumber([1234, 5678, 90, 1112])
print(r135)  # 11121234567890


# 136: 剑指 Offer 58 - I. 翻转单词顺序
# 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。
# 例如输入字符串"I am a student. ",则输出"student. a am I"。
# 示例 1:
# 输入: "the sky is blue"
# 输出: "blue is sky the"
#
# 示例 2:
# 输入: "  hello world!  "
# 输出: "world! hello"
# 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
#
# 示例 3:
# 输入: "a good   example"
# 输出: "example good a"
# 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。


class Solution136:
    def reverseWords(self, s: str) -> str:
        s = s.strip()
        s = s.split()
        s = s[::-1]
        return " ".join(s)


s136 = Solution136()
r136 = s136.reverseWords("People only lose when they give up fighting. As long as they keep fighting, "
                         "they haven't lost yet.")
print(r136)  # yet. lost haven't they fighting, keep they as long As fighting. up give they when lose only People


# 137: 面试题 16.05. 阶乘尾数
# 设计一个算法,算出 n 阶乘有多少个尾随零。
# 示例 1:
# 输入: 3
# 输出: 0
# 解释: 3! = 6, 尾数中没有零。
#
# 示例 2:
# 输入: 5
# 输出: 1
# 解释: 5! = 120, 尾数中有 1 个零.


class Solution137:
    def trailingZeroes(self, n: int) -> int:
        if n == 0:
            return 0
        count = 0
        while n > 0:
            n = n // 5
            count += n
        return count


s137 = Solution137()
r137 = s137.trailingZeroes(80)
print(r137)  # 19


# 138: 买卖股票的最佳时机 II
# 给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。
# 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
# 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
# 示例 1:
# 输入: prices = [7,1,5,3,6,4]
# 输出: 7
# 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
#      随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
# 示例 2:
# 输入: prices = [1,2,3,4,5]
# 输出: 4
# 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
#      注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。


class Solution138:
    def maxProfit(self, prices: list[int]) -> int:
        profit = 0
        for i in range(1, len(prices)):
            tmp = prices[i] - prices[i - 1]
            if tmp > 0: profit += tmp
        return profit


s138 = Solution138()
r138 = s138.maxProfit([2, 4, 6, 1, 3, 5])
print(r138)  # 8


# 139: 两个数组的交集 II
# 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,
# 应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
# 示例 1:
# 输入:nums1 = [1,2,2,1], nums2 = [2,2]
# 输出:[2,2]
#
# 示例 2:
# 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
# 输出:[4,9]


class Solution139:
    def intersect(self, nums1: list[int], nums2: list[int]) -> list[int]:
        from collections import Counter
        return [i for i in (Counter(nums1) & Counter(nums2)).elements()]


s139 = Solution139()
r139 = s139.intersect([1, 2, 3, 4], [3, 4, 5, 6])
print(r139)  # [3, 4]


# 139: 两个数组的交集 II
# 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,
# 应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
# 示例 1:
# 输入:nums1 = [1,2,2,1], nums2 = [2,2]
# 输出:[2,2]
#
# 示例 2:
# 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
# 输出:[4,9]


class Solution139:
    def intersect(self, nums1: list[int], nums2: list[int]) -> list[int]:
        from collections import Counter
        return [i for i in (Counter(nums1) & Counter(nums2)).elements()]


s139 = Solution139()
r139 = s139.intersect([1, 2, 3, 4], [3, 4, 5, 6])
print(r139)  # [3, 4]


# 140: 二进制求和
# 给你两个二进制字符串,返回它们的和(用二进制表示)。
# 输入为 非空 字符串且只包含数字 1 和 0。
# 示例 1:
# 输入: a = "11", b = "1"
# 输出: "100"
#
# 示例 2:
# 输入: a = "1010", b = "1011"
# 输出: "10101"


class Solution140:
    def addBinary(self, a: str, b: str) -> str:
        a1 = bin(eval("0b{}".format(a)))
        b1 = bin(eval("0b{}".format(b)))
        res = int(a1, 2) + int(b1, 2)
        return str(bin(res))[2:]


s140 = Solution140()
r140 = s140.addBinary("101101", "110011")
print(r140)  # 1100000

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

相关文章

网友评论

      本文标题:Python:基础入门练习131 - 140

      本文链接:https://www.haomeiwen.com/subject/pnsmfrtx.html