日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

将整型字符串转成整数值

發(fā)布時(shí)間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将整型字符串转成整数值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目:給定一個(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í)候不太懂其中幾行代碼

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

注意通過分析通向公式是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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。