vc6 字符串转为浮点数_LeetCode8-字符串转整数

dca459eebad91b970389274be55675d1.png

昨天就看到说:今天武汉会有超强冷空气光临,果然没有迟到。早上在学校一广场边上的石凳子上读英语,冷风直嗖嗖的往衣服里钻,冻得我紧紧的抱住像200+斤的自己,边吃包子边发抖的读英语,这滋味怎一个爽字了得!!!


实现 atoi,将字符串转为整数

该函数首先根据需要丢弃任意多的空格字符,直到找到第一个非空格字符为止。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。

当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。

若函数不能执行有效的转换,返回 0。

这一题其实没什么算法可言,主要的困难就是每一种分类情况要分清楚,稍微弄混淆了就有可能出错,有几点注意的地方我提下:

  1. 题目所给的字符串里面可能会有空格符,这个对我们来说是不需要的,所以我们可以先用str.split()将原始字符串分割成几个不含空格符的子字符串,这样解题速度会更快些。
  2. 另外就是注意:我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

代码如下:

class Solution:
    def myAtoi(self, str):
        """
        :type str: str
        :rtype: int
        """
        str_split = str.split()
        str_list = []
        if len(str_split) == 0:
            return 0
        for indice in range(len(str_split)):
            if str_split[indice][0] == '-' and len(str_split[indice]) >= 2:
                str_list.append('-')
                for str_indice in range(1, len(str_split[indice])):
                    if '0' <= str_split[indice][str_indice] <= '9':
                        str_list.append(str_split[indice][str_indice])
                    else:
                        break
                if len(str_list) == 1:
                    return 0
                else:
                    str_copy = int(''.join(str_list))
                    if str_copy <= -2**31:
                        return -2**31
                    if str_copy >= 2**31 - 1:
                        return 2**31 - 1
                    return  str_copy
            elif str_split[indice][0] == '+' and len(str_split[indice]) >= 2:
                for str_indice in range(1, len(str_split[indice])):
                    if '0' <= str_split[indice][str_indice] <= '9':
                        str_list.append(str_split[indice][str_indice])
                    else:
                        break
                if len(str_list) == 0:
                    return 0
                else:
                    str_copy = int(''.join(str_list))
                    if str_copy <= -2 ** 31:
                        return -2 ** 31
                    if str_copy >= 2 ** 31 - 1:
                        return 2 ** 31 - 1
                    return str_copy
            elif '0' <= str_split[indice][0] <= '9':
                for str_indice in range(len(str_split[indice])):
                    if '0' <= str_split[indice][str_indice] <= '9':
                        str_list.append(str_split[indice][str_indice])
                    else:
                        break
                str_copy = int(''.join(str_list))
                if str_copy <= -2 ** 31:
                    return -2 ** 31
                if str_copy >= 2 ** 31 - 1:
                    return 2 ** 31 - 1
                return str_copy
            else:
                return 0

执行时间你还别说,还算是很不错的,虽然代码较长,但还是挺欣喜的。

a2201c23ada385eed96ef55ba5037529.png

2019/5/18 12:03更新

至于各种分类情况我再强调一些细节,因为本题考查的也是各种情况的全面性。

  1. 首字符为"+", "-"符号,需要用标志符记录下来;
  2. 首字符为字母或其它非数字以及"+", "-"符号,说明当前字符串不合标准,立即退出返回0;
  3. 其他位置上只要不是数字,也立即退出返回前面得到的符合标准的字符串;

这儿有一种情况是题目中没有给出的,刷题时报错了,所以就想分享一下。就是类似于"3.1415"这样的浮点数,结果是'3",也就是说结果只识整数,不转化浮点数。

代码如下:

class Solution:
    # 此题还需注意的就是类似于3.1415的浮点数的出现了
    def myAtoi(self, str):
        """
        :type str: str
        :rtype: int
        """
        # 首先将给定字符串以空格符切分
        str_split = str.split()
        if len(str_split) == 0:
            return 0
        # 我们只需要考虑str_split[0]即可
        detect_str = str_split[0]
        # 分别定义选取字符串转为整数的起始和终止下标值
        start = 0
        end = 0
        # 定义标志符来区分首字符是否为“+”“-”;“+”用1来表示,反之用-1表示
        flag = 1
        for index in range(len(detect_str)):
            # 如果首字符为“+”“-”,则我们相应改变flag的值,并且都将start与end的值相应+1
            if index == 0 and detect_str[index] in ["-", "+"]:
                flag = 1 if detect_str[index] == "+" else -1
                start += 1
                end += 1
            # 如果当前字符为字母,立即退出
            elif detect_str[index].isdigit():
                end += 1
            # 其它的各种情况均不符合,立即退出 
            else:
                break
        # 通过start与end的值得到我们需要的整数,此处注意正负号
        new_num = int(detect_str[start:end])*flag if start < end else 0
        # 最后的结果别忘了其取值范围是[-2**31, 2**31-1]
        return min(new_num, 2**31-1) if new_num >= 0 else max(new_num, -2**31)


if __name__ == "__main__":
    init_str = "3.14159"
    str_to_int = Solution().myAtoi(init_str)
    print(str_to_int)

执行效率出奇的高,达到了100%

45a57df8487c2e3e000b25ae070a9a0e.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值