題目
請(qǐng)你來實(shí)現(xiàn)一個(gè) atoi 函數(shù)凡辱,使其能將字符串轉(zhuǎn)換成整數(shù)。
首先栗恩,該函數(shù)會(huì)根據(jù)需要丟棄無用的開頭空格字符透乾,直到尋找到第一個(gè)非空格的字符為止。接下來的轉(zhuǎn)化規(guī)則如下:
如果第一個(gè)非空字符為正或者負(fù)號(hào)時(shí)磕秤,則將該符號(hào)與之后面盡可能多的連續(xù)數(shù)字字符組合起來乳乌,形成一個(gè)有符號(hào)整數(shù)。
假如第一個(gè)非空字符是數(shù)字亲澡,則直接將其與之后連續(xù)的數(shù)字字符組合起來,形成一個(gè)整數(shù)纫版。
該字符串在有效的整數(shù)部分之后也可能會(huì)存在多余的字符床绪,那么這些字符可以被忽略,它們對(duì)函數(shù)不應(yīng)該造成影響其弊。
注意:假如該字符串中的第一個(gè)非空格字符不是一個(gè)有效整數(shù)字符癞己、字符串為空或字符串僅包含空白字符時(shí),則你的函數(shù)不需要進(jìn)行轉(zhuǎn)換梭伐,即無法進(jìn)行有效轉(zhuǎn)換痹雅。
在任何情況下,若函數(shù)不能進(jìn)行有效的轉(zhuǎn)換時(shí)糊识,請(qǐng)返回 0 绩社。
提示:
本題中的空白字符只包括空格字符 ' ' 摔蓝。
假設(shè)我們的環(huán)境只能存儲(chǔ) 32 位大小的有符號(hào)整數(shù),那么其數(shù)值范圍為 [?231, 231 ? 1]愉耙。如果數(shù)值超過這個(gè)范圍贮尉,請(qǐng)返回 INT_MAX (231 ? 1) 或 INT_MIN (?231) 。
示例 1:
輸入: "42"
輸出: 42
示例 2:
輸入: " -42"
輸出: -42
解釋: 第一個(gè)非空白字符為 '-', 它是一個(gè)負(fù)號(hào)朴沿。我們盡可能將負(fù)號(hào)與后面所有連續(xù)出現(xiàn)的數(shù)字組合起來,最后得到 -42 。
示例 3:
輸入: "4193 with words"
輸出: 4193
解釋: 轉(zhuǎn)換截止于數(shù)字 '3' 症歇,因?yàn)樗南乱粋€(gè)字符不為數(shù)字淮腾。
示例 4:
輸入: "words and 987"
輸出: 0
解釋: 第一個(gè)非空字符是 'w', 但它不是數(shù)字或正、負(fù)號(hào)坚芜。因此無法執(zhí)行有效的轉(zhuǎn)換览芳。
示例 5:
輸入: "-91283472332"
輸出: -2147483648
解釋: 數(shù)字 "-91283472332" 超過 32 位有符號(hào)整數(shù)范圍。因此返回 INT_MIN (?231) 货岭。
題解
這是我的解題過程路操,花了很長(zhǎng)時(shí)間,以失敗告終......
def myAtoi(self, str: str) -> int:
flag,res = None, ''
if str=="" or str=="-" or str=="+":
return 0
for c in str:
if c == ' ':
continue
if c in "-+0123456789":
if c in "0123456789":
if flag == None:
flag = 1
res += c
elif c in "-":
if flag == None:
flag = -1
else:
return flag*int(res) if int(res)>=-2**31 and int(res)<=2**31-1 else 2**31-1 if flag==1 else -2**31
elif c in "+":
if flag == None:
flag = 1
else:
return flag*int(res) if int(res)>=-2**31 and int(res)<=2**31-1 else 2**31-1 if flag==1 else -2**31
elif flag == None:
return 0
elif flag != None:
return flag*int(res) if int(res)>=-2**31 and int(res)<=2**31-1 else 2**31-1 if flag==1 else -2**31
return flag*int(res) if int(res)>=-2**31 and int(res)<=2**31-1 else 2**31-1 if flag==1 else -2**31
看了別人的一些思路
def myAtoi(self, str: str) -> int:
str = str.lstrip()
if len(str)==0 or (str[0].isdigit()==False and str[0] not in ["-", "+"]):
return 0
res, i = str[0], 1
while i<len(str) and str[i].isdigit():
res += str[i]
i += 1
try:
res = int(res)
return min(max(res, -2**31), 2**31-1)
except:
return 0
執(zhí)行結(jié)果:通過
顯示詳情
執(zhí)行用時(shí) :44 ms, 在所有 Python3 提交中擊敗了68.07%的用戶
內(nèi)存消耗 :13.6 MB, 在所有 Python3 提交中擊敗了7.14%的用戶
這個(gè)思路是真的鬼才千贯,用正則表達(dá)式做......
def myAtoi(self, s: str) -> int:
return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)
執(zhí)行結(jié)果:通過
顯示詳情
執(zhí)行用時(shí) :40 ms, 在所有 Python3 提交中擊敗了83.22%的用戶
內(nèi)存消耗 :13.6 MB, 在所有 Python3 提交中擊敗了7.14%的用戶