300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 将整型字符串转成整数值

将整型字符串转成整数值

时间:2021-01-12 09:17:50

相关推荐

将整型字符串转成整数值

题目:给定一个字符串str,如果str符合日常书写的整数形式,并且属于32位整数的范围,返回str所代表的整数值,否则返回0。

举例:

str = “123”,返回123。

str = “023”,因为不符合日常的书写习惯,返回0。

str = “A123”,返回0。

str = “2147483647”,返回2147482647

str = “2147483648”,溢出,返回0。

str = “-123”,返回-123。

基本思路

分为两大步骤。第一步骤,判断字符串的格式是否正确。第二步骤,如果符合书写规范,将字符串转换成整数型。

一.判断字符串是否符合书写规范。

如果str不以‘-’开头,也不以数字字符开头,返回False。

如果str以‘-’开头,但是字符串的长度为1,或者字符串的第二个字符是0,返回False。

如果字符串以‘0’开头,但是字符串的长度大于1,返回False。

如果步骤1~3都不返回False,遍历str[1…N-1],如果有一个不是数字字符,返回False。如果都是数字字符,返回True。

二.将字符串转换为整数型。

32位整数的范围是-2^31 ~ 2^31-1,最小整数的绝对值大,所以在转换的过程中的绝对值一律以负数形式出现。具体过程如下:

1、使用布尔型变量posi来表示转换的数字是正还是负,正为True,负为False,由字符串的第一个字符来确定posi的值。使用res变量来表示转换的结果。

2、如果第一个字符是‘-’,从str[1]开始向右遍历,否则从str[0]开始向右遍历。假设遍历到当前的字符的负数形式是cur,res = res × 10 + cur。遍历的过程中统一使用负数形式,最后在根据posi的值确定最终的结果。

3、遍历过程中如何判断数字是否溢出?使用两个变量,minq代表32位整数最小值除以10的商,minr表示32位整数最小值除以10的余数。在遍历累加的过程中,如果发现res的值已经小于minq,那么再加上cur,则最终的结果一定溢出。如果res的值等于minq,又发现cur小于minr,则最终的结果也一定溢出。出现任意一种溢出的情况,直接返回0。

4、最后根据posi的值来确定数字的正负。注意如果res = -2^31,但是posi = True,此时正溢出,返回0。

5、为什么需要使用minq,minr的方式来判断溢出而不直接和-2^31 ~,2^31-1比较?因为对于32位系统如果所累积的和超过这个范围,计算机就已经无法表示,程序会直接报错

6、很多人可能刚开始看的时候不太懂其中几行代码

if res < minq or (res == minq and cur < minr):return 0res = res * 10 + cur

注意通过分析通向公式是res = res * 10 + cur 所以前面判断的是倒数第二位,如果倒数第二位比之前/10的商小的话,那乘以10还是比最终的数小;如果倒数第二位相等cur比余数小,那同样res也比结果小,返回0

def isValid(strs):if strs[0]=='-' and (len(strs)==1 or strs[1]==0):return Falseif strs[0]=='0' and len(strs)!=1:return Falseif strs[0]!='-' and (strs[0]) < '0' or strs[0] > '9'):retrun Falsefor i in range(1,len(strs)):if strs[i] < '0' or strs[i] > '9':return Falsereturn Truedef convert(strs):if strs == None or strs == '':return 0if not isvalid(strs):return 0minp = (-1 << 31) / 10minq = (-1 << 31) % 10cur = 0res = 0if strs[0] = '-':posi = Falseelse:posi = Truefor i in range(0 if posi else 1,len(strs)):cur = '0' - strs[i]if res < minp or (res == minp and cur < minq):return 0res = res * 10 + curif posi and res == (-1<<31):return 0return -res if posi else res

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。