# -*- 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
微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!