LeetCode004:字串轉整數 (atoi)
一、寫在前面
LeetCode 第一題兩數之和傳輸門:LeetCode001:兩數之和 LeetCode 第二題兩個排序陣列的中位數傳輸門:LeetCode002:兩個排序陣列的中位數 LeetCode 第三題最長迴文子串傳輸門:eetCode003:最長迴文子串 今天給大家分享的是LeetCode 陣列與字串 第四題:字串轉整數 (atoi),為面試而生,期待你的加入。
二、今日題目
實現 atoi,將字串轉為整數。
該函式首先根據需要丟棄任意多的空格字元,直到找到第一個非空格字元為止。如果第一個非空字元是正號或負號,選取該符號,並將其與後面儘可能多的連續的數字組合起來,這部分字元即為整數的值。如果第一個非空字元是數字,則直接將其與之後連續的數字字元組合起來,形成整數。
字串可以在形成整數的字元後面包括多餘的字元,這些字元可以被忽略,它們對於函式沒有影響。
當字串中的第一個非空字元序列不是個有效的整數;或字串為空;或字串僅包含空白字元時,則不進行轉換。
若函式不能執行有效的轉換,返回 0。
說明:
假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231, 231 − 1]。如果數值超過可表示的範圍,則返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例:
示例 1:
輸入: "42"
輸出: 42
示例 2:
輸入: " -42"
輸出: -42
解釋: 第一個非空白字元為 '-', 它是一個負號。
我們儘可能將負號與後面所有連續出現的數字組合起來,最後得到 - 42 。
示例 3:
輸入: "4193 with words"
輸出: 4193
解釋: 轉換截止於數字 '3' ,因為它的下一個字元不為數字。
示例 4:
輸入: "words and 987"
輸出: 0
解釋: 第一個非空字元是 'w', 但它不是數字或正、負號。
因此無法執行有效的轉換。
示例 5:
輸入: "-91283472332"
輸出: -2147483648
解釋: 數字 "-91283472332" 超過 32 位有符號整數範圍。
因此返回 INT_MIN (−231) 。
三、 分析
這個題目呢,題目比較長,示例也比較多,可能大家看著比較不耐煩或者“害怕”,我以過來人的身份告訴大家,這個題目,很簡單,看我下面對題目的解析吧()
四、解題
- 我的方法: 思路比較簡單:就是根據上面的分析,把每個關鍵點一一擊破,那些時候return 0是首要的,然後再看符號怎麼處理,資料範圍怎麼處理…
程式碼除錯過程異常艱辛,執行過程中遇到的各種bug…
輸入:"-5-"
輸出:0
預期:-5
輸入:"+-2"
輸出:2
預期:0
輸入:"5+"
輸出:報錯,'5+'不能被轉換成float
預期:5
這裡只列舉了一部分典型錯誤。。。
- 程式碼
'''
date : 2018.10.08
author : 極簡XksA
'''
'''
題目:
實現 atoi,將字串轉為整數。
ascii to integer
'''
# 我的方法
class Solution(object):
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
# 字串不為空/第一個字元不為數字/-/+
str = str.strip() # 去除兩端空格
if str == '': #為空
return 0
if str[0] != '-' and str[0] != '+' and not str[0].isdigit():
return 0 # 第一個字元不為數字/-/+
import re
# 確保字串內包含數字/+/-
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:
# 確保字串內包含數字
pattern0 = re.compile("[0-9]+")
test01 = pattern0.findall(judge[0])
if not test01:
return 0 # 只有+/-
if not judge[0][1:2].isdigit():
return 0 #去除 ++/-- 屬於第一個字元不為數字情況
if judge[0][0] == '-' or judge[0][0] == '+':
judge[0] = judge[0][0] + test01[0] # 第一個字元為 +/- 結果為符號+數字
else: # 只有數字,無符號位
judge[0] = test01[0]
interim_target = float(judge[0]) # 轉換成float判斷範圍
if interim_target < -2147483648:
return -2147483648
if interim_target > 2147483647:
return 2147483647
target = int(judge[0]) # 範圍內,轉換成int 返回
return target
- 提交結果
測試資料:1079組 執行時間:48ms 擊敗人百分比:73.24%
好在提交結果還不錯,不然,花費這麼長時間,真的要吐血啊。。。
五、疑惑
LeetCode已經刷了4題了,我深刻認識到自己更新速度慢,想了一下,有下面幾個原因:1.建的8人LeetCode群沒活躍起來,平時我忙,研究生的學長學姐可能更忙,群裡交流比較少幾乎全是我主動,沒帶起節奏,是我的錯;2.關注這個系列的人比較少,從閱讀量可以看出來,我實在沒有精力去寫這個有去寫別的有趣的知識點,希望大家以後多多支援這個系列,點贊點廣告支援一下,一塊兩塊的讚賞也可以,隨時轉發一下,不是為了錢,而是我想知道,我做這個是有人支援的,而且不是一兩個人;3.我相對還是比較笨的,學習新東西,“消化”過程比較長,但我從不因為我在一個不是一流的大學,不是學霸就放棄學習,進步很慢,至少還有進步,我會繼續堅持這個系列;4.沒有目標,說的一個星期2-3題,快一個月了,這才第4題,從今天開始,一週兩題,週一和週四晚上更新(恰好這兩天下午沒課)。 希望大家能夠監督我,我希望每次週一,週四早上能在學習交流群內看到有人催我更新LeetCode。
六、結語
目前學習交流1群已滿,2群已有40+人加入,期待更多的人一起加入,多交流學習。 加我微信:zs820553471,拉你進學習交流群,免費送精選學習資源。 堅持 and 努力 : 終有所獲。
歡迎大家關注微信公眾號:極簡XksA,獲取Python/Java/前端等學習資源!