1. 程式人生 > >Leetcode 字串轉換整數 (atoi)

Leetcode 字串轉換整數 (atoi)

先上程式碼:

import re
class Solution(object):
    def myAtoi(self, str):
        str = str.strip()
        #[-+]表示第一個字元為正負號,?表示匹配正負號0次或1次,\d表示數字,+表示匹配數字一到無限次
        digit_str = re.match(r'[-+]?\d+', str)
        if(digit_str == None):
            return 0
        else:
            digit_int = int(digit_str.group())
            INT_MAX = ((1 << 31) - 1)
            INT_MIN = (-1 << 31)
            if digit_int>INT_MAX:
                return (INT_MAX)
            elif digit_int<INT_MIN:
                return (INT_MIN)
            else:
                return (digit_int)

 

思路:

用正則表示式來匹配,這樣效率最高,程式碼最簡潔,難點是怎麼理解需要提取的正則表示式,以及正則表示式怎麼寫。提取出來之後處理一下溢位的情況,就ok了。

我們要提取的目標字串,第一個字元可以是正負號,也可以沒有符號,第一個字元就是數字。用 [-+] 表示可以是正號或者符號(or),接著的?表示前面一項匹配0-1次,表明正負號可以不出現,或者只出現一次。表示數字的是/d,我們要把連續的數字都算上,那麼這一項就會匹配一到無窮次,我們在 \d 後面接上 + 表示匹配一到無窮次。到這裡就搞定了。

小記:

這是AC之後我在官方解答看到的解法,非常值得學習。不用正則表示式的話,程式碼會不可避免地冗長一點,以下放上我的一般解法。

class Solution(object):
    def myAtoi(self, str):
        nums = '0123456789'
        #處理特殊輸入
        if str == '':   return 0
        if len(str) == 1 and str not in nums:   return 0
        n = len(str)
        #擷取第一個非空格字元之後的子串
        rest = ''
        for i in range(n):
            if str[i] != ' ':
                if str[i] ==  '-':
                    rest = str[i:]
                    break
                elif str[i] == '+':
                    rest = str[i+1:]
                    break
                elif str[i] in nums:
                    rest = str[i:]
                    break
                else:
                    return 0
        if rest == '':    return 0
        print rest
        #符號之後必須跟著數字
        if rest[0] not in nums and len(str) != 1 and (str[i+1] not in nums and str[i+1] != '.'):
            print "hey"
            return 0
        num = ''
        #去掉連續數字之後的非數字字元
        for i in range(len(rest)):
            #首字元為負號
            if i == 0 and rest[i] == '-':
                num += '-'
                continue
            #是數字則加入字串
            if rest[i] in nums:
                num += rest[i]
            else:
                break
        print num,"here" 
        #排除溢位情況
        num = int(num)
        if num >= 2147483648:
            return 2147483647
        if num <= -2147483648:
            return -2147483648
        return num