将整型字符串转成整数值
題目:給定一個(gè)字符串str,如果str符合日常書寫的整數(shù)形式,并且屬于32位整數(shù)的范圍,返回str所代表的整數(shù)值,否則返回0。
舉例:
str = “123”,返回123。?
str = “023”,因?yàn)椴环先粘5臅鴮懥?xí)慣,返回0。?
str = “A123”,返回0。?
str = “2147483647”,返回2147482647?
str = “2147483648”,溢出,返回0。?
str = “-123”,返回-123。
基本思路
分為兩大步驟。第一步驟,判斷字符串的格式是否正確。第二步驟,如果符合書寫規(guī)范,將字符串轉(zhuǎn)換成整數(shù)型。
一.判斷字符串是否符合書寫規(guī)范。
如果str不以‘-’開頭,也不以數(shù)字字符開頭,返回False。
如果str以‘-’開頭,但是字符串的長度為1,或者字符串的第二個(gè)字符是0,返回False。
如果字符串以‘0’開頭,但是字符串的長度大于1,返回False。
如果步驟1~3都不返回False,遍歷str[1…N-1],如果有一個(gè)不是數(shù)字字符,返回False。如果都是數(shù)字字符,返回True。
二.將字符串轉(zhuǎn)換為整數(shù)型。
32位整數(shù)的范圍是-2^31 ~ 2^31-1,最小整數(shù)的絕對(duì)值大,所以在轉(zhuǎn)換的過程中的絕對(duì)值一律以負(fù)數(shù)形式出現(xiàn)。具體過程如下:
1、使用布爾型變量posi來表示轉(zhuǎn)換的數(shù)字是正還是負(fù),正為True,負(fù)為False,由字符串的第一個(gè)字符來確定posi的值。使用res變量來表示轉(zhuǎn)換的結(jié)果。
2、如果第一個(gè)字符是‘-’,從str[1]開始向右遍歷,否則從str[0]開始向右遍歷。假設(shè)遍歷到當(dāng)前的字符的負(fù)數(shù)形式是cur,res = res × 10 + cur。遍歷的過程中統(tǒng)一使用負(fù)數(shù)形式,最后在根據(jù)posi的值確定最終的結(jié)果。
3、遍歷過程中如何判斷數(shù)字是否溢出?使用兩個(gè)變量,minq代表32位整數(shù)最小值除以10的商,minr表示32位整數(shù)最小值除以10的余數(shù)。在遍歷累加的過程中,如果發(fā)現(xiàn)res的值已經(jīng)小于minq,那么再加上cur,則最終的結(jié)果一定溢出。如果res的值等于minq,又發(fā)現(xiàn)cur小于minr,則最終的結(jié)果也一定溢出。出現(xiàn)任意一種溢出的情況,直接返回0。
4、最后根據(jù)posi的值來確定數(shù)字的正負(fù)。注意如果res = -2^31,但是posi = True,此時(shí)正溢出,返回0。
5、為什么需要使用minq,minr的方式來判斷溢出而不直接和-2^31 ~,2^31-1比較?因?yàn)閷?duì)于32位系統(tǒng)如果所累積的和超過這個(gè)范圍,計(jì)算機(jī)就已經(jīng)無法表示,程序會(huì)直接報(bào)錯(cuò)
6、很多人可能剛開始看的時(shí)候不太懂其中幾行代碼
注意通過分析通向公式是res = res * 10 + cur? 所以前面判斷的是倒數(shù)第二位,如果倒數(shù)第二位比之前/10的商小的話,那乘以10還是比最終的數(shù)小;如果倒數(shù)第二位相等cur比余數(shù)小,那同樣res也比結(jié)果小,返回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?
總結(jié)
以上是生活随笔為你收集整理的将整型字符串转成整数值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断两个字符串是否为旋转词
- 下一篇: 字符串的统计字符串