1. 程式人生 > >LeetCode004:字串轉整數 (atoi)

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)

三、 分析

這個題目呢,題目比較長,示例也比較多,可能大家看著比較不耐煩或者“害怕”,我以過來人的身份告訴大家,這個題目,很簡單,看我下面對題目的解析吧() Process Analysis

可能流程看著還有些複雜,但仔細讀,都是比較簡單的實現,接下來就一起敲鍵盤吧~

四、解題

  • 我的方法: 思路比較簡單:就是根據上面的分析,把每個關鍵點一一擊破,那些時候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/前端等學習資源!

極簡XksA