2021年5月21日

8 . String to Integer

实现自己的atoi函数,能够将字符串转化为32位有符号整数

  1. 抛弃前导空格
  2. 识别下一个字符是否为正负号,直至遇到第一个非数字字符为止
  3. 数字超过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)

posted @ 2021-05-21 11:03  tianle1998  阅读(50)  评论(0)    收藏  举报