请你来实现一个 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://edu.ichenhua.cn/read/415