1. 10——正则表达式匹配
给你一个字符串 s
和一个字符规律 p
,请你来实现一个支持 '.'
和 '*'
的正则表达式匹配。
'.'
匹配任意单个字符'*'
匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖整个字符串 s 的,而不是部分字符串。
标签:递归,字符串,动态规划(困难题目前不会)
代码:
2. 11——盛最多水的容器
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。
标签:数组,双指针
代码:
class Solution:
def maxArea(self, height: List[int]) -> int:
left = 0
right = len(height) - 1
res = 0
while left < right:
area = (right - left) * min(height[left], height[right])
res = area if area > res else res
if height[left] < height[right]:
left = left + 1
else:
right = right - 1
return res
3. 12——整数转罗马数字
七个不同的符号代表罗马数字,其值如下:
符号 | 值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
- 如果该值以 4 或 9 开头,使用减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (
V
) 减 1 (I
):IV
,9 是 10 (X
) 减 1 (I
):IX
。仅使用以下减法形式:4 (IV
),9 (IX
),40 (XL
),90 (XC
),400 (CD
) 和 900 (CM
)。 - 只有 10 的次方(
I
,X
,C
,M
)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V
),50 (L
) 或 500 (D
)。如果需要将符号附加4次,请使用减法形式。
给定一个整数,将其转换为罗马数字。
标签:哈希表,数学,字符串
代码:
class Solution:
def intToRoman(self, num: int) -> str:
haxi = {1000: "M", 900: "CM", 500: "D", 400: "CD",
100: "C", 90: "XC", 50: "L", 40: "XL", 10: "X",
9: "IX", 5: "V", 4: "IV", 1: "I"}
res = ''
for key in haxi:
while num >= key:
res = res + haxi[key]
num = num - key
if num == 0:
break
return res
4. 13——罗马数字转整数
罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 M
。
字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000
例如, 罗马数字 2
写做 II
,即为两个并列的 1 。12
写做 XII
,即为 X
+ II
。 27
写做 XXVII
, 即为 XX
+ V
+ II
。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII
,而是 IV
。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX
。这个特殊的规则只适用于以下六种情况:
I
可以放在V
(5) 和X
(10) 的左边,来表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左边,来表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
标签:哈希表,数学,字符串
代码:
class Solution:
def romanToInt(self, s: str) -> int:
haxi = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}
res = 0
for i in range(len(s) - 1):
first = s[i]
second = s[i + 1]
if haxi[first] < haxi[second]:
res = res - haxi[first]
else:
res = res + haxi[first]
end = s[-1]
res = res + haxi[end]
return res
5. 14——最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""
。
标签:字符串
代码:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
def two_str(s1, s2):
res = ""
i = 0
while i < len(s1) and i < len(s2):
if s1[i] == s2[i]:
res = res + s1[i]
i = i + 1
else:
break
return res
res = strs[0]
for i in strs:
res = two_str(res, i)
if res == "": # 没有公共前缀,提前结束循环
break
return res