這是我參與11月更文挑戰(zhàn)的第12天。

一、寫在前面

LeetCode 第一題兩數(shù)之和傳輸門:聽說(shuō)你還在寫雙層for循環(huán)解兩數(shù)之和?

LeetCode 第二題兩數(shù)之和傳輸門:兩個(gè)排序數(shù)組的中位數(shù),“最”有技術(shù)含量的解法!

LeetCode 第三題最長(zhǎng)回文子串傳輸門:馬拉車算法解最長(zhǎng)回文子串!Manacher

今天給大家分享的是LeetCode 數(shù)組與字符串 第四題:字符串轉(zhuǎn)整數(shù) (atoi),為面試而生,期待你的加入。

二、今日題目

實(shí)現(xiàn) atoi,將字符串轉(zhuǎn)為整數(shù)。

該函數(shù)首先根據(jù)需要丟棄任意多的空格字符,直到找到第一個(gè)非空格字符為止。如果第一個(gè)非空字符是正號(hào)或負(fù)號(hào),選取該符號(hào),并將其與后面盡可能多的連續(xù)的數(shù)字組合起來(lái),這部分字符即為整數(shù)的值。如果第一個(gè)非空字符是數(shù)字,則直接將其與之后連續(xù)的數(shù)字字符組合起來(lái),形成整數(shù)。

字符串可以在形成整數(shù)的字符后面包括多余的字符,這些字符可以被忽略,它們對(duì)于函數(shù)沒(méi)有影響。

當(dāng)字符串中的第一個(gè)非空字符序列不是個(gè)有效的整數(shù);或字符串為空;或字符串僅包含空白字符時(shí),則不進(jìn)行轉(zhuǎn)換。

若函數(shù)不能執(zhí)行有效的轉(zhuǎn)換,返回 0。

說(shuō)明:

假設(shè)我們的環(huán)境只能存儲(chǔ) 32 位有符號(hào)整數(shù),其數(shù)值范圍是 [?231, 231 ? 1]。如果數(shù)值超過(guò)可表示的范圍,則返回 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ù)字組合起來(lái),最后得到 -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)。     因此無(wú)法執(zhí)行有效的轉(zhuǎn)換。示例 5:輸入: "-91283472332"輸出: -2147483648解釋: 數(shù)字 "-91283472332" 超過(guò) 32 位有符號(hào)整數(shù)范圍。      因此返回 INT_MIN (?231) 。

三、 分析

這個(gè)題目呢,題目比較長(zhǎng),示例也比較多,可能大家看著比較不耐煩或者“害怕”,我以過(guò)來(lái)人的身份告訴大家,這個(gè)題目,很簡(jiǎn)單,看我下面對(duì)題目的解析吧,如標(biāo)題所說(shuō),我愿將此方法稱之為“愚公移山”,直接分情況討論,然后合并成一般(通用)情況和特色(個(gè)例)情況,逐個(gè)判斷擊破即可,歡迎大家評(píng)論區(qū)分享更多解法。


可能流程看著還有些復(fù)雜,但仔細(xì)讀,都是比較簡(jiǎn)單的實(shí)現(xiàn),接下來(lái)就一起敲鍵盤吧~

四、解題

  • 我的方法:
    思路比較簡(jiǎn)單:就是根據(jù)上面的分析,把每個(gè)關(guān)鍵點(diǎn)一一擊破,那些時(shí)候return 0是首要的,然后再看符號(hào)怎么處理,數(shù)據(jù)范圍怎么處理...

代碼調(diào)試過(guò)程異常艱辛,運(yùn)行過(guò)程中遇到的各種bug...

輸入:"-5-"輸出:0預(yù)期:-5輸入:"+-2"輸出:2預(yù)期:0輸入:"5+"輸出:報(bào)錯(cuò),5+不能被轉(zhuǎn)換成float預(yù)期:5這里只列舉了一部分典型錯(cuò)誤。。。
  • 代碼
    題目:實(shí)現(xiàn) atoi,將字符串轉(zhuǎn)為整數(shù)。ascii to integer

我的方法

class Solution(object):
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""

字符串不為空/第一個(gè)字符不為數(shù)字/-/+

    str = str.strip()  # 去除兩端空格    if str == :   #為空        return 0    if str[0] != - and str[0] != + and not str[0].isdigit():        return 0    # 第一個(gè)字符不為數(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   #去除  ++/-- 屬于第一個(gè)字符不為數(shù)字情況        if judge[0][0] == - or judge[0][0] == +:            judge[0] = judge[0][0] + test01[0]   # 第一個(gè)字符為 +/- 結(jié)果為符號(hào)+數(shù)字        else:  # 只有數(shù)字,無(wú)符號(hào)位            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é)果![提交結(jié)果](https://s4.51cto.com/images/blog/202111/23103418_619c532a7c0c547125.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)>測(cè)試數(shù)據(jù):1079組
運(yùn)行時(shí)間:48ms
擊敗人百分比:73.24%好在提交結(jié)果還不錯(cuò),不然,花費(fèi)這么長(zhǎng)時(shí)間,真的要吐血啊。。。### 五、結(jié)語(yǔ)堅(jiān)持 and 努力 : 終有所獲。思想很復(fù)雜,實(shí)現(xiàn)很有趣,只要不放棄,終有成名日。—《老表打油詩(shī)》下期見,我是愛貓愛技術(shù)的老表,如果覺(jué)得本文對(duì)你學(xué)習(xí)有所幫助,歡迎點(diǎn)贊、評(píng)論、關(guān)注我!