本文关键词:字符串转整数,atoi,题解,Leetcode, 力扣,Python, C++, Java

题目地址:https://leetcode-cn.com/problems/string-to-integer-atoi/

题目描述

Implement the myAtoi(string s) function, which converts a string to a 32-bit signed integer (similar to C/C++'s atoi function).

Thealgorithm for myAtoi(string s) is as follows:

1、 Readinandignoreanyleadingwhitespace.;
2、 Checkifthenextcharacter(ifnotalreadyattheendofthestring)is'-'or'+'.Readthischaracterinifitiseither.Thisdeterminesifthefinalresultisnegativeorpositiverespectively.Assumetheresultispositiveifneitherispresent.;
3、 Readinnextthecharactersuntilthenextnon-digitcharcterortheendoftheinputisreached.Therestofthestringisignored.;
4、 Convertthesedigitsintoaninteger(i.e."123"->123,"0032"->32).Ifnodigitswereread,thentheintegeris0.Changethesignasnecessary(fromstep2).;
5、 Iftheintegerisoutofthe32-bitsignedintegerrange[-231,231-1],thenclamptheintegersothatitremainsintherange.Specifically,integerslessthan-231shouldbeclampedto-231,andintegersgreaterthan231-1shouldbeclampedto231-1.;
6、 Returntheintegerasthefinalresult.;

Note:

1、 Onlythespacecharacter''isconsideredaswhitespacecharacter.;
2、 Assumewearedealingwithanenvironmentwhichcouldonlystoreintegerswithinthe32-bitsignedintegerrange:[−231,231−1].Ifthenumericalvalueisoutoftherangeofrepresentablevalues,INT_MAX(231−1)orINT_MIN(−231)isreturned.;

Example 1:

Input: "42"
Output: 42

Example 2:

Input: "   -42"
Output: -42
Explanation: The first non-whitespace character is '-', which is the minus sign.
             Then take as many numerical digits as possible, which gets 42.

Example 3:

Input: "4193 with words"
Output: 4193
Explanation: Conversion stops at digit '3' as the next character is not a numerical digit.

Example 4:

Input: "words and 987"
Output: 0
Explanation: The first non-whitespace character is 'w', which is not a numerical 
             digit or a +/- sign. Therefore no valid conversion could be performed.

Example 5:

Input: "-91283472332"
Output: -2147483648
Explanation: The number "-91283472332" is out of the range of a 32-bit signed integer. Thefore INT_MIN (−231) is returned.

题目大意

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

1、 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数;
2、 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数;
3、 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响;

解题方法

这个题是我一直“珍藏”没做的题,因为我知道这个题的坑比较多。这次算是认真的做了一次。

重点还是理解题目给了什么规则:去除起始的空格;判断正负号;找第一个开始的数字开始,到第一个非数字字符处停止。

在这种字符串处理的题目中,我一般都是选用Python大法结合正则表达式,特别是正则表达式是大杀器。

做法:

1、 去除开始和结尾的所有空字符,使用.strip()方法;
2、 使用正则表达式找出"+","-",数字开始,到第一个非数字字符处停止的数字该正则是"^[+-]?\d+",可以用http://tool.chinaz.com/regex/进行校验;
3、 把数字转成整数(使用Python的int()函数,Python的int可以表示出无限大的数字,不用担心越界);
4、 如果超出了题目说的INT_MAXINT_MIN的边界,则返回INT_MAXINT_MIN

代码

Python代码如下。

import re
class Solution(object):
    def myAtoi(self, num):
        """
        :type str: str
        :rtype: int
        """
        num = num.strip()
        if not num:
            return 0
        res = re.findall(r"^[+-]?\d+", num)
        if not res:
            return 0
        res = int(res[0])
        return max(min(res, 2 ** 31 - 1), -2 ** 31)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有

本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发