首页 > 其他 > 详细

剑指 Offer 67. 把字符串转换成整数(数学规律)

时间:2020-09-03 21:07:43      阅读:96      评论:0      收藏:0      [点我收藏+]
  • 题目描述
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。

 

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−2^31,  2^31 − 1]。如果数值超过这个范围,请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: "42"
输出: 42
示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 -, 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 3 ,因为它的下一个字符不为数字。
示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 w, 但它不是数字或正、负号。
     因此无法执行有效的转换。
示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−231) 。
  • 解法

解题步骤:

1. 首尾去除空格:str.strip()

2. 判断符号位‘+’ ‘-’ 和无符号

3.从左向右遍历字符串组成数字

用res = res * 10 + x组成当前组成的数字,其中res表示从左向右组成的数的大小,乘10表示数字不断左移递增,x表示增加的当前位。

这里需要注意的是,什么时候遍历结束?

a) 遍历需要非数字的字符

b) 遍历组成的数字res超过范围

[−2^31,  2^31 − 1]

技术分享图片

 

 好了,可以写了(记得把符号位和数字位分离,并且判断从i开始遍历,如果字符串是无符号数,则i初始化为0,如果为有符号数,则初始化为1)

class Solution:
    def strToInt(self, str: str) -> int:
        str = str.strip()
        if not str:
            return 0
        if str[0] not in +- and not str[0].isnumeric():
            return 0
        int_max = 2 ** 31-1
        int_min = -2 ** 31
        bndry = 2 ** 31 // 10
        sign = 1
        res = 0
        if str[0] == -:
            sign = -1
            i = 1
        elif str[0] == +:
            i = 1
        else:
            i = 0
        for st in str[i:]:
            if 0 <= st <=9:
                if res > bndry or res == bndry and st > 7:
                    return int_max if sign==1 else int_min
                else:
                    res = res * 10 + ord(st) - ord(0)
            else:
                break
        return res * sign

时间复杂度 O(N) : 其中 NN 为字符串长度,线性遍历字符串占用 O(N) 时间。
空间复杂度 O(N) : 删除首尾空格后需建立新字符串,最差情况下占用 O(N)额外空间。

参考:https://leetcode-cn.com/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/solution/mian-shi-ti-67-ba-zi-fu-chuan-zhuan-huan-cheng-z-4/

剑指 Offer 67. 把字符串转换成整数(数学规律)

原文:https://www.cnblogs.com/yeshengCqupt/p/13610566.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!