当前位置: 首页 > 后端技术 > Python

LeetCodeStringtoInteger(atoi)

时间:2023-03-25 23:44:54 Python

StringtoInteger(atoi)题目来源:https://leetcode-cn.com/problems/string-to-integer-atoi题目实现一个atoi函数,使其可以将字符串转换为转换为整数。首先,该函数根据需要丢弃无用的前导空白字符,直到找到第一个非空白字符。当我们要查找的第一个非空字符是正号或负号时,该符号与尽可能多的连续数字组合,作为整数的正负号;如果第一个非空字符是数字,则直接将它们与后面连续的数字字符组合成一个整数。字符串有效整数部分后可能有冗余字符,这些字符可以忽略,应该不会影响功能。注意:如果字符串中的第一个非空白字符不是有效的整数字符、字符串为空或字符串仅包含空白字符,则您的函数不需要转换。在任何情况下,如果函数无法执行有效转换,则返回0。解释:假设我们的环境只能存储32位有符号整数,那么它的取值范围是[?231,231?1]。如果值超出此范围,则返回INT_MAX(231?1)或INT_MIN(?231)。示例1:输入:"42"输出:42示例2:输入:"-42"输出:-42解释:第一个非空白字符是'-',这是一个减号。我们尝试将负号与后面的所有连续数字组合起来,最后得到-42。示例3:输入:"4193withwords"输出:4193解释:转换在数字'3'处结束,因为它的下一个字符不是数字。示例4:输入:"wordsand987"输出:0解释:第一个非空字符是'w',但它不是数字或加号或减号。因此无法执行有效的转换。示例5:输入:“-91283472332”输出:-2147483648解释:数字“-91283472332”超出了32位有符号整数的范围。因此返回INT_MIN(?231)。解题思路是先去掉前面的空格(这里没有使用lstrip()函数,避免创建新的变量,直接定位非空格字符的索引);定位到不是空格的索引后,从这里判断第一个字符为+和-case。定义sign,初始化为1表示正数,如果遇到-,修改为-1,表示负数判断是否为数字,直接与ASCII码值比较;如果没有+和-字符,则判断第一个字符不是数字,直接跳出循环;判断该值是否会越界,如果越界则跳出循环。关于越界部分的内容,可以参考下面这篇文章:Python整数反转上面的文章大致说到了越界的情况,这里的处理也是类似的。只是这里遍历的字符和负模不同,所以在处理最小值边界的时候要注意。代码实现类解决方案:defmyAtoi(self,str:str)->int:#max_value_div_10=(1<<31)//10#min_value_div_10=-(-((1<<31)-1)//-10)INT_MAX=(1<<31)-1INT_MIN=-(1<<31)str_len=len(str)#去掉空格,这里不要使用lstrip(),避免新的遍历#直接定位不是的字符索引aspaceindex=0whileindex'9'orcur_chr<'0':breakcur_chr=int(cur_chr)#判断是否Boundaryifres>INT_MAX//10or(res==INT_MAX//10andcur_chr>7):returnINT_MAX#这里的处理边界有点不一样,和上面的文章相比,需要注意ifres<-(INT_MIN//-10)or(res==-(INT_MIN//-10)andcur_chr>8):returnINT_MIN#每一步将符号位乘以res=res*10+sign*cur_chrindex+=1returnres实现结果在扩展部分,这里有一个比较tricky的方案。除了导入必要的库外,使用正则表达式一行代码也可以解决问题。源码来自以下作者的解决方案:https://leetcode-cn.com/problems/string-to-integer-atoi/solution/python-1xing-zheng-ze-biao-da-shi-by-knifezhu/大致是这样的:classSolution:defmyAtoi(self,s:str)->int:importrereturnmax(min(int(*re.findall('^[\+\-]?\d+',s.lstrip())),2**31-1),-2**31)这里max(min(number,2**31-1),-2**31)处理边界问题,重新.findall()这里要找的是满足条件的部分,这里的*星号表示解包。虽然这样的解决方案很烦人,但还是建议好好想想背后的原理。以上是本文的主要内容。欢迎关注微信公众号《书所集录》

最新推荐
猜你喜欢