(Python) LeetCode 8:字符串转换整数(atoi)

题目描述:

 

思路:

思路其实比较简单,就是对字符串进行判断,如果有正负号,一定是在前面,并且只能有一个,如果有两个,那么就是一个错误的数,就返回0,所以这里做的判断是只读取一个(在第一个while处)然后再到第二个判断数字的while循环处,如果此时的字符不是一个数字,那肯定是有问题的,所以就break,然后在判断是否是合法的数那里进行判断。

另外就是如果前面的字符是空格,则向后读取,直到不为空格,就会到 elif 或是直接跳出然后执行第二个while循环处,或是全部读完代表这个字符串只有空格,那么strNew长度为0,返回0,其余情况就是到第二个while处的判断。

代码:

# -- coding: utf-8 --
# @Time : 2021/11/12   15:39
# @Author : ZKK
# @File : 字符串转换整数.py

class Solution:
    def myAtoi(self, s: str):  # 将字符串转为一个整数
        j = 0            # 相当于字符串 s 的下标
        length = len(s)  # 字符串长度
        strNew = ''      # 新的字符串
        while j < length:   # 判断前面是否有空格或者是正负号
            p = s[j]
            if p == ' ':    # 如果是空格,则j+1 继续向后读取,直到读到一个非空格的数或是读完了(全为空格)
                j+=1
            elif p =='+' or p == '-':   # 一旦读取到一个 正负号就直接退出循环,进行下一个循环判断
                strNew += p
                j += 1
                break
            else:
                break
        i = j                # 从当前字符开始,判断是不是一个数字
        while i < length:
            p = s[i]
            if ord(p) >= 48 and ord(p) <= 57:   # 比较ASCII值,也可以直接字符进行比较
                strNew += p
                i += 1
            else:
                break
        if len(strNew)==0 or strNew=='+' or strNew=='-': # 判断是否是合法的数,不是返回0
            num = 0
        else:
            num = int(strNew)

        if num > (pow(2, 31) - 1):   # 截断超过范围的数为边界值
            return pow(2,31)-1
        elif num < -pow(2,31):
            return -pow(2, 31)
        return num    # 没有超过则正常返回


if __name__ == '__main__':
    solution = Solution()
    print(solution.myAtoi("   +987"))
    print(solution.myAtoi("    -87"))
    print(solution.myAtoi("words and 987"))
    print(solution.myAtoi("837249693871270370"))
    print(solution.myAtoi("-91283472332"))
    print(solution.myAtoi("-+12"))

执行结果:

 

Guess you like

Origin blog.csdn.net/weixin_44260459/article/details/121290554
Recommended