写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
示例 1:
输入: “42”
输出: 42
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————————————
这里要注意整数的溢出,在每次乘10并相加得到的结果可能会溢出,所以需要进行INT_MAX//10进行溢出判断。其Python代码如下:
class Solution:
def strToInt(self, str: str) -> int:
str=str.strip() # 清空空格字符
if not str: # 如果字符为空,返回0
return 0
if str[0]!='+' and str[0]!='-' and str[0]<'0' and str[0]>'9': # 如果第一个字符不是+-号或者不是0-9的数值,则返回0
return 0
flag = 1 # 用于标记是否是+-号
if str[0]=='-':
flag = -1
str = str[1:]
elif str[0]=='+':
flag = 1
str = str[1:]
nums = 0
for i in range(len(str)):
if '0'<=str[i]<='9':
if nums>(2**31-1)//10 or (nums==(2**31-1)//10 and int(str[i]))>7: # 这里是为了防止溢出,如果其值大于INT_MAX//10或者其值等于INT_MAX//10但是最后一个值大于7,则根据flag值返回最大值或者最小值。
if flag>0:
return 2**31-1
else:
return -2**31
nums = nums*10 + int(str[i])
else:
break
return flag*nums