题目描述:
思路:
思路其实比较简单,就是对字符串进行判断,如果有正负号,一定是在前面,并且只能有一个,如果有两个,那么就是一个错误的数,就返回0,所以这里做的判断是只读取一个(在第一个while处)然后再到第二个判断数字的while循环处,如果此时的字符不是一个数字,那肯定是有问题的,所以就break,然后在判断是否是合法的数那里进行判断。
另外就是如果前面的字符是空格,则向后读取,直到不为空格,就会到 elif 或是直接跳出然后执行第二个while循环处,或是全部读完代表这个字符串只有空格,那么strNew长度为0,返回0,其余情况就是到第二个while处的判断。
代码:
# -- coding: utf-8 --
# @Time : 2021/11/12 15:39
# @Author : ZKK
# @File : 字符串转换整数.py
class Solution:
def myAtoi(self, s: str): # 将字符串转为一个整数
j = 0 # 相当于字符串 s 的下标
length = len(s) # 字符串长度
strNew = '' # 新的字符串
while j < length: # 判断前面是否有空格或者是正负号
p = s[j]
if p == ' ': # 如果是空格,则j+1 继续向后读取,直到读到一个非空格的数或是读完了(全为空格)
j+=1
elif p =='+' or p == '-': # 一旦读取到一个 正负号就直接退出循环,进行下一个循环判断
strNew += p
j += 1
break
else:
break
i = j # 从当前字符开始,判断是不是一个数字
while i < length:
p = s[i]
if ord(p) >= 48 and ord(p) <= 57: # 比较ASCII值,也可以直接字符进行比较
strNew += p
i += 1
else:
break
if len(strNew)==0 or strNew=='+' or strNew=='-': # 判断是否是合法的数,不是返回0
num = 0
else:
num = int(strNew)
if num > (pow(2, 31) - 1): # 截断超过范围的数为边界值
return pow(2,31)-1
elif num < -pow(2,31):
return -pow(2, 31)
return num # 没有超过则正常返回
if __name__ == '__main__':
solution = Solution()
print(solution.myAtoi(" +987"))
print(solution.myAtoi(" -87"))
print(solution.myAtoi("words and 987"))
print(solution.myAtoi("837249693871270370"))
print(solution.myAtoi("-91283472332"))
print(solution.myAtoi("-+12"))
执行结果: