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