這是我參與11月更文挑戰(zhàn)的第12天。
一、寫在前面
LeetCode 第一題兩數(shù)之和傳輸門:聽說你還在寫雙層for循環(huán)解兩數(shù)之和?
LeetCode 第二題兩數(shù)之和傳輸門:兩個排序數(shù)組的中位數(shù),“最”有技術(shù)含量的解法!
LeetCode 第三題最長回文子串傳輸門:馬拉車算法解最長回文子串!Manacher
今天給大家分享的是LeetCode 數(shù)組與字符串 第四題:字符串轉(zhuǎn)整數(shù) (atoi),為面試而生,期待你的加入。
二、今日題目
實現(xiàn) atoi,將字符串轉(zhuǎn)為整數(shù)。
該函數(shù)首先根據(jù)需要丟棄任意多的空格字符,直到找到第一個非空格字符為止。如果第一個非空字符是正號或負(fù)號,選取該符號,并將其與后面盡可能多的連續(xù)的數(shù)字組合起來,這部分字符即為整數(shù)的值。如果第一個非空字符是數(shù)字,則直接將其與之后連續(xù)的數(shù)字字符組合起來,形成整數(shù)。
字符串可以在形成整數(shù)的字符后面包括多余的字符,這些字符可以被忽略,它們對于函數(shù)沒有影響。
當(dāng)字符串中的第一個非空字符序列不是個有效的整數(shù);或字符串為空;或字符串僅包含空白字符時,則不進(jìn)行轉(zhuǎn)換。
若函數(shù)不能執(zhí)行有效的轉(zhuǎn)換,返回 0。
說明:
假設(shè)我們的環(huán)境只能存儲 32 位有符號整數(shù),其數(shù)值范圍是 [?231, 231 ? 1]。如果數(shù)值超過可表示的范圍,則返回 INT_MAX (231 ? 1) 或 INT_MIN (?231) 。
示例:
示例 1:輸入: "42"輸出: 42示例 2:輸入: " -42"輸出: -42解釋: 第一個非空白字符為 -, 它是一個負(fù)號。 我們盡可能將負(fù)號與后面所有連續(xù)出現(xiàn)的數(shù)字組合起來,最后得到 -42 。示例 3:輸入: "4193 with words"輸出: 4193解釋: 轉(zhuǎn)換截止于數(shù)字 3 ,因為它的下一個字符不為數(shù)字。示例 4:輸入: "words and 987"輸出: 0解釋: 第一個非空字符是 w, 但它不是數(shù)字或正、負(fù)號。 因此無法執(zhí)行有效的轉(zhuǎn)換。示例 5:輸入: "-91283472332"輸出: -2147483648解釋: 數(shù)字 "-91283472332" 超過 32 位有符號整數(shù)范圍。 因此返回 INT_MIN (?231) 。
三、 分析
這個題目呢,題目比較長,示例也比較多,可能大家看著比較不耐煩或者“害怕”,我以過來人的身份告訴大家,這個題目,很簡單,看我下面對題目的解析吧,如標(biāo)題所說,我愿將此方法稱之為“愚公移山”,直接分情況討論,然后合并成一般(通用)情況和特色(個例)情況,逐個判斷擊破即可,歡迎大家評論區(qū)分享更多解法。
可能流程看著還有些復(fù)雜,但仔細(xì)讀,都是比較簡單的實現(xiàn),接下來就一起敲鍵盤吧~
四、解題
- 我的方法:
思路比較簡單:就是根據(jù)上面的分析,把每個關(guān)鍵點一一擊破,那些時候return 0是首要的,然后再看符號怎么處理,數(shù)據(jù)范圍怎么處理...
代碼調(diào)試過程異常艱辛,運行過程中遇到的各種bug...
輸入:"-5-"輸出:0預(yù)期:-5輸入:"+-2"輸出:2預(yù)期:0輸入:"5+"輸出:報錯,5+不能被轉(zhuǎn)換成float預(yù)期:5這里只列舉了一部分典型錯誤。。。
- 代碼
題目:實現(xiàn) atoi,將字符串轉(zhuǎn)為整數(shù)。ascii to integer
我的方法
class Solution(object):
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
字符串不為空/第一個字符不為數(shù)字/-/+
str = str.strip() # 去除兩端空格 if str == : #為空 return 0 if str[0] != - and str[0] != + and not str[0].isdigit(): return 0 # 第一個字符不為數(shù)字/-/+ import re # 確保字符串內(nèi)包含數(shù)字/+/- pattern = re.compile("[-+0-9]+") judge = pattern.findall(str) # 例如:" ","-","+" if not judge or judge[0] == + or judge[0] == -: return 0 # 例如:"++","--","-+/+-","-2-","2-","--2" if len(judge[0]) >= 2: # 確保字符串內(nèi)包含數(shù)字 pattern0 = re.compile("[0-9]+") test01 = pattern0.findall(judge[0]) if not test01: return 0 # 只有+/- if not judge[0][1:2].isdigit(): return 0 #去除 ++/-- 屬于第一個字符不為數(shù)字情況 if judge[0][0] == - or judge[0][0] == +: judge[0] = judge[0][0] + test01[0] # 第一個字符為 +/- 結(jié)果為符號+數(shù)字 else: # 只有數(shù)字,無符號位 judge[0] = test01[0] interim_target = float(judge[0]) # 轉(zhuǎn)換成float判斷范圍 if interim_target < -2147483648: return -2147483648 if interim_target > 2147483647: return 2147483647 target = int(judge[0]) # 范圍內(nèi),轉(zhuǎn)換成int 返回 return target
- 提交結(jié)果>測試數(shù)據(jù):1079組
運行時間:48ms
擊敗人百分比:73.24%好在提交結(jié)果還不錯,不然,花費這么長時間,真的要吐血啊。。。### 五、結(jié)語堅持 and 努力 : 終有所獲。思想很復(fù)雜,實現(xiàn)很有趣,只要不放棄,終有成名日。—《老表打油詩》下期見,我是愛貓愛技術(shù)的老表,如果覺得本文對你學(xué)習(xí)有所幫助,歡迎點贊、評論、關(guān)注我!