请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

- 读入字符串并丢弃无用的前导空格

- 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。

- 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。

- 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。

- 如果整数数超过 32 位有符号整数范围 [−2^31,  2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −2^31 ,大于 2^31 − 1 的整数应该被固定为 2^31 − 1 。

返回整数作为最终结果。

注意:

本题中的空白字符只包括空格字符 ' ' 。

除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

示例

输入:"  -42abc"  输出:-42

解析

1)题目很长,其实要做的事很简单,就是将字符串转整数;

2)系统的int函数,只能转数字型的字符串,所以转之前需要特殊处理一下;

3)首先要把左侧的空格去掉,然后判断最左侧的是不是+-号;

4)之后就是依次往后遍历,碰到非数字停止即可;

5)需要注意的是整数范围,不能超过32位。

代码示例

1、常规遍历解法

class Solution:
    def myAtoi(self, s: str) -> int:
        s = s.lstrip()
        if len(s) == 0:
            return 0
        ans = 0
        f = 1
        if s[0] == '-' or s[0] == '+':
            f = -1 if s[0]=='-' else 1
            s = s[1:]
        for w in s:
            if w.isdigit():
                ans = ans * 10 + int(w)
            else:
                break
        if f * ans > 2**31-1: return 2**31-1
        if f * ans < -2**31: return -2**31
        return f * ans

执行用时:40 ms, 在所有 Python3 提交中击败了 72.39% 的用户.

2、正则骚操作

import re

class Solution:
    def myAtoi(self, s: str) -> int:
        m = re.search('^\s*([+-]?\d{1,})', s)
        if m and m.group(1):
            ans = int(m.group(1))
        else:
            ans = 0
        if ans > 2**31-1: return 2**31-1
        if ans < -2**31: return -2**31
        return ans

执行用时:28 ms, 在所有 Python3 提交中击败了 99.53% 的用户.

本文为 陈华 原创,欢迎转载,但请注明出处:http://www.ichenhua.cn/read/415