將整型字串轉成整數值

2021-09-25 00:08:49 字數 2429 閱讀 9842

題目:給定乙個字串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 0

res = 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 false

if strs[0]=='0' and len(strs)!=1:

return false

if strs[0]!='-' and (strs[0]) < '0' or strs[0] > '9'):

retrun false

for i in range(1,len(strs)):

if strs[i] < '0' or strs[i] > '9':

return false

return true

def convert(strs):

if strs == none or strs == '':

return 0

if not isvalid(strs):

return 0

minp = (-1 << 31) / 10

minq = (-1 << 31) % 10

cur = 0

res = 0

if strs[0] = '-':

posi = false

else:

posi = true

for i in range(0 if posi else 1,len(strs)):

cur = '0' - strs[i]

if res < minp or (res == minp and cur < minq):

return 0

res = res * 10 + cur

if posi and res == (-1<<31):

return 0

return -res if posi else res

字串之將整數字串轉成整數值

字串之將整形字串轉成整數值,並且屬於32位整數範圍 str 123 返回 123 str 012 不符合書寫習慣,所以返回0 str a12 返回0 str 0 返回 0 str 214783647 返回 214783647 str 214783647 因為溢位了,所以返回 0 package co...

字串轉成整數

實現atoi這個函式,將乙個字串轉換為整數。如果沒有合法的整數,返回0。如果整數超出了32位整數的範圍,返回int max 2147483647 如果是正整數,或者int min 2147483648 如果是負整數。該題目較為複雜,需要分類討論多種情況。題意為將字串中出現的第乙個完整的整數返回,包括...

整數轉成字串

1.使用itoa函式 char itoa int value char string,int radix 原型說明 value 欲轉換的資料。radix 轉換後的進製數,可以是2進製 8進製 10進製 16進製制等。exmaple include include int main void 2.不利...