0008字符串轉(zhuǎn)換整數(shù) (atoi)_Wise的筆記

題目描述

請你來實現(xiàn)一個 atoi 函數(shù),使其能將字符串轉(zhuǎn)換成整數(shù)。

首先,該函數(shù)會根據(jù)需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符為止。

當我們尋找到的第一個非空字符為正或者負號時,則將該符號與之后面盡可能多的連續(xù)數(shù)字組合起來,作為該整數(shù)的正負號;假如第一個非空字符是數(shù)字,則直接將其與之后連續(xù)的數(shù)字字符組合起來,形成整數(shù)。

該字符串除了有效的整數(shù)部分之后也可能會存在多余的字符,這些字符可以被忽略,它們對于函數(shù)不應該造成影響。

注意:假如該字符串中的第一個非空格字符不是一個有效整數(shù)字符、字符串為空或字符串僅包含空白字符時,則你的函數(shù)不需要進行轉(zhuǎn)換。

在任何情況下,若函數(shù)不能進行有效的轉(zhuǎn)換時,請返回 0。

說明:

假設我們的環(huán)境只能存儲 32 位大小的有符號整數(shù),那么其數(shù)值范圍為 [?231, 231 ? 1]。如果數(shù)值超過這個范圍,qing返回 INT_MAX (231 ? 1) 或 INT_MIN (?231) 。

示例 1:

輸入: "42"
輸出: 42

示例 2:

輸入: " -42"
輸出: -42
解釋: 第一個非空白字符為 '-', 它是一個負號。
我們盡可能將負號與后面所有連續(xù)出現(xiàn)的數(shù)字組合起來,最后得到 -42 。

示例 3:

輸入: "4193 with words"
輸出: 4193
解釋: 轉(zhuǎn)換截止于數(shù)字 '3' ,因為它的下一個字符不為數(shù)字。

示例 4:

輸入: "words and 987"
輸出: 0
解釋: 第一個非空字符是 'w', 但它不是數(shù)字或正、負號。
因此無法執(zhí)行有效的轉(zhuǎn)換。

示例 5:

輸入: "-91283472332"
輸出: -2147483648 [Add to Citavi project by ISBN]
解釋: 數(shù)字 "-91283472332" 超過 32 位有符號整數(shù)范圍。
因此返回 INT_MIN (?231) 。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/string-to-integer-atoi
著作權(quán)歸領(lǐng)扣網(wǎng)絡所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

解題思路

沒有思路 按照題意 全是if else 臉紅

    def myAtoi(self, str: str) -> int:
        result = ""
        negative = 1
        label = 0
        if str == "":
            return 0
        for i in str:
            if i == " " :
                if result == "":
                    continue
                else: 
                    break
            elif i=="-":
                if label == 0 and result == "":
                    label = 1
                    negative = -1
                    result += "-"
                else:
                    break
            elif i=="+":
                if label == 0 and result == "":
                    label =1
                    negative = 1
                    result += "+"
                else:
                    break
            elif i in "1234567890":
                result +=i
            elif result !="" :
                break
            else :
                return 0
        try:
            I = int(result)
        except :
            return 0
        t= pow(2,31)

        if I < -1*t :
            return -1*t
        elif I>t-1:
            return t-1
        else:
            return   I 
圖片.png

改進

可以先用 strip() 函數(shù) 使空格切割 字符

其他解法

class Solution:
    def myAtoi(self, s: str) -> int:
        return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)

使用正則表達式:

^:匹配字符串開頭
[+-]:代表一個+字符或-字符
?:前面一個字符可有可無
\d:一個數(shù)字
+:前面一個字符的一個或多個
\D:一個非數(shù)字字符
*:前面一個字符的0個或多個

max(min(數(shù)字, 231 - 1), -231) 用來防止結(jié)果越界

為什么可以使用正則表達式?如果整數(shù)過大溢出怎么辦?

題目中描述: 假設我們的環(huán)境只能存儲 32 位大小的有符號整數(shù)

首先,這個假設對于 Python 不成立,Python 不存在 32 位的 int 類型。其次,即使搜索到的字符串轉(zhuǎn)32位整數(shù)可能導致溢出,我們也可以直接通過字符串判斷是否存在溢出的情況(比如 try 函數(shù) 或 判斷字符串長度 + 字符串比較),聰明的你應該會解決這個問題吧?

作者:QQqun902025048
鏈接:https://leetcode-cn.com/problems/two-sum/solution/python-1xing-zheng-ze-biao-da-shi-by-knifezhu/
來源:力扣(LeetCode)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容