2021年5月21日
8 . String to Integer
实现自己的atoi函数,能够将字符串转化为32位有符号整数
- 抛弃前导空格
- 识别下一个字符是否为正负号,直至遇到第一个非数字字符为止
- 数字超过32位有符号整数表示范围应进行截断
INT_MAX = 2 ** 31 - 1
INT_MIN = -2 ** 31
class Automation:
def __init__(self):
self.state = 'start'
self.sign = 1
self.ans = 0
self.table = {
'start' : {'start', 'signed', 'in_number', 'end'},
'signed' : {'end', 'end', 'in_number', 'end'},
'in_number' : {'end', 'end', 'in_number', 'end'},
'end' : {'end', 'end', 'end', 'end'},
}
def get_col(self, c):
if c.isspace():
return 0
if c in ['+', '-']:
return 1
if c.isdigit():
return 2
return 3
def get(self, c):
self.state = self.table[self.state][self.get_col(c)]
if self.state == 'in_number':
self.ans = self.ans * 10 + int(c)
self.ans = min(self.ans, INT_MAX) if self.sign == 1 else min(self.ans, -INT_MIN)
elif self.state == 'signed':
self.sign = 1 if c == '+' else -1
class Solution:
def myAtoi(self, str: str) -> int:
automaton = Automaton()
for c in str:
automaton.get(c)
return automaton.sign * automaton.ans
利用有限状态自动机
时间复杂度:O(n)
空间复杂度: O(1)
9 . 回文数
判断整数是否为回文数
class Solution:
def isPalindrome(self, x: int) -> bool:
s = str(x)
return s == s[::-1]
11 . 盛最多水的容器
给定n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
双指针法:
class Solution:
def maxArea(self, height: List[int]) -> int:
l, r = 0, len(height) - 1
ans = 0
while l < r:
area = min(height[l], height[r]) * (r - l)
ans = max(ans, area)
if height[l] <= height[r]:
l += 1
else:
r -= 1
return ans
时间复杂度:O(N)
空间复杂度:O(1)
浙公网安备 33010602011771号