请你来实现一个 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.chenhuax.com/read/415