Python:基础入门练习131 - 140

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342