注意,这题开头必须是数字,如果不是数字或者正负号,直接返回0。这题不是从字符当中取数值。而是提取字符开头的数字,如果不是数字就返回0。
思路就是先判断这个字符是否“合格”,也就是开头是否“有数”。
如果有,则下一步,去掉开头的0和结尾的无用字符。
最后将字符转为数字格式。
这题主要是用到了ascii码,0-9的ascii码是 48-57,直接判断ascii码是不是在48-57范围就ok。+/-号就不用ascii了,因为可以直接判断+和-。
class Solution:
INT_MAX = 2 ** 31 - 1
INT_MIN = -2 ** 31
def myAtoi(self, s: str) -> int:
# 先将开头和结尾的空格去掉
s = s.strip()
if s == "" or s == "-" or s == "+":
return 0
# 先判断这个字符串是否符合要求,否则直接返回0
if not self.valid(s):
return 0
num_str = self.remove_head_zero_zuo(s)
negative = False
res = 0
for i in range(len(num_str)):
if num_str[i] == "-":
negative = True
continue
elif num_str[i] == "+":
continue
num = ord(num_str[i]) - 48
res *= 10
res += num
if negative:
res = -res
if res > self.INT_MAX:
res = self.INT_MAX
elif res < self.INT_MIN:
res = self.INT_MIN
return res
def valid(self, s):
if s[0] == "-" or s[0] == "+":
if ord(s[1]) >= ord('0') and ord(s[1]) <= ord('9'):
return True
else:
return False
elif ord(s[0]) >= ord('0') and ord(s[0]) <= ord('9'):
return True
else:
return False
def remove_head_zero_zuo(self, s):
# fnz:第一个不为0的字符位置 first not zero location
r = True if s[0] == "+" or s[0] == "-" else False
# 从左往右,一直到不为0,则break
fnz = 1 if r else 0 # 开头的0的位置,当然开头也可能不是0
while fnz < len(s):
if s[fnz] != "0":
break
fnz += 1
# e为数字之后的第一个非数字字符。也就是数字的结尾。这个是从右到左遍历
e = -1
i = len(s) - 1
while i >= (1 if r else 0): # 当开头是+或者-就到最多到第二个位置,否则遍历整个数组
if ord(s[i]) < ord('0') or ord(s[i]) > ord('9'):
e = i
# 当之后都是数字,e就不再更新了
i -= 1
# 所以总体是[fnz,e)即为数字
return (s[0] if r else "") + s[fnz:e if e != -1 else None]