Leetcode 8.字符串转换 atoi

题目

8. 字符串转换 atoi

题目简化分析

字符串转换问题。满足以下要求:

  • 第一个非空字符可以是数字或者符号-,+
  • 从第二个非空字符开始,在遇到非数字字符时结束。
  • 若无法满足上述要求,返回0

Insight

  1. 用正则表达式匹配。优势:代码简单且清晰。代码
  2. 官方的解答。用了自动机的方法。代码

实现

相比正则表达式的方法,自动机的方法似乎可以适配更复杂的规则情况,所以重写了官方自动机的方法。

// 重写:21.93% / 9.09% | 官方:6.64% / 9.09% | 区别在于官方答案在查询到`end`后会继续执行程序
// 重写的答案在查询到`end`后会跳出查询程序,直接进入返回结果的部分。
class Automatic(object):
    def __init__(self):
        self.status = 'starter'
        self.signed = 1
        self.nums = 0
        self.table = {
            'starter':['starter','signed','nums','end'],
            'signed':['end','end','nums','end'],
            'nums':['end','end','nums','end'],
        }

    def get_c_col(self,c):
        if c.isspace():
            return 0
        elif c == '-' or c == '+':
            return 1
        elif c.isdigit():
            return 2
        else:
            return 3

    def get_nums(self):
        return self.signed * self.nums

    def get_c(self,c):
        self.status = self.table[self.status][self.get_c_col(c)]
        if self.status == 'end':
            return 1
        elif self.status == 'signed':
            self.signed = -1 if c == '-' else 1
        elif self.status == 'nums':
            self.nums = 10*self.nums + int(c)
        else:
            pass
    

class Solution(object):
    def myAtoi(self, str):
        """
        :type str: str
        :rtype: int
        """

        MIN = -2 ** 31
        MAX = 2 ** 31-1
        auto = Automatic()
        for c in str:
            if auto.get_c(c):
                break
        sum = min(max(auto.get_nums(),MIN),MAX)
        return sum
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值