字符串问题---将整数字符串转成整数型

该博客讨论了如何判断一个字符串是否符合32位整数格式,并将其转换为整数。通过两个步骤,首先检查字符串格式,然后在不溢出的情况下转换字符串。文章提供了具体的判断条件和Python代码实现。
摘要由CSDN通过智能技术生成

【题目】

  给定一个字符串str,如果str符合日常书写的整数形式,并且属于32位整数的范围,返回str所代表的整数值,否则返回0。

【举例】

  str = “123”,返回123。
  str = “023”,因为不符合日常的书写习惯,返回0。
  str = “A123”,返回0。
  str = “2147483647”,返回2147482647
  str = “2147483648”,溢出,返回0。
  str = “-123”,返回-123。

【基本思路】

  分为两大步骤。第一步骤,判断字符串的格式是否正确。第二步骤,如果符合书写规范,将字符串转换成整数型。

一.判断字符串是否符合书写规范。

  1. 如果str不以‘-’开头,也不以数字字符开头,返回False。
  2. 如果str以‘-’开头,但是字符串的长度为1,或者字符串的第二个字符是0,返回False。
  3. 如果字符串以‘0’开头,但是字符串的长度大于1,返回False。
  4. 如果步骤1~3都不返回False,遍历str[1…N-1],如果有一个不是数字字符,返回False。如果都是数字字符,返回True。

二.将字符串转换为整数型。

  32位整数的范围是-2^31 ~ 2^31-1,最小整数的绝对值大,所以在转换的过程中的绝对值一律以负数形式出现。具体过程如下:

  1. 使用布尔型变量posi来表示转换的数字是正还是负,正为True,负为False,由字符串的第一个字符来确定posi的值。使用res变量来表示转换的结果。

  2. 如果第一个字符是‘-’,从str[1]开始向右遍历,否则从str[0]开始向右遍历。假设遍历到当前的字符的负数形式是cur,res = res × 10 + cur。遍历的过程中统一使用负数形式,最后在根据posi的值确定最终的结果。

  3. 遍历过程中如何判断数字是否溢出?使用两个变量,minq代表32位整数最小值除以10的商,minr表示32位整数最小值除以10的余数。在遍历累加的过程中,如果发现res的值已经小于minq,那么再加上cur,则最终的结果一定溢出。如果res的值等于minq,又发现cur小于minr,则最终的结果也一定溢出。出现任意一种溢出的情况,直接返回0。

  4. 最后根据posi的值来确定数字的正负。注意如果res = -2^31,但是posi = True,此时正溢出,返回0。

  5. 为什么需要使用minq,minr的方式来判断溢出而不直接和-2^31 ~,2^31-1比较?因为对于32位系统如果所累积的和超过这个范围,计算机就已经无法表示,程序会直接报错。

下面是使用python3.5实现的代码

#将整数字符串转成整数型
def convert(str1):
    def isValid(str1):
        if str1[0] != "-" and (ord(str1[0]) < ord('0') or ord(str1[0]) > ord('9')):
            return False
        if str1[0] == '-' and (len(str1) == 1 or str1[1] == '0'):
            return False
        if str[0] == '0' and len(str) > 1:
            return False
        for i in range(1, len(str1)):
            if ord(str1[i]) < ord('0') or ord(str1[i]) > ord('9'):
                return False
        return True

    if str1 == None or str1 == "":
        return 0
    if not isValid(str1):
        return 0
    posi = False if str1[0] == '-' else True
    minq = (-1 << 31) / 10
    minr = (-1 << 31) % 10
    res = 0
    cur = 0
    for i in range(0 if posi else 1, len(str1)):
        cur = ord('0') - ord(str1[i])
        if res < minq or (res == minq and cur < minr):
            return 0
        res = res * 10 + cur
    if posi and res == (-1 << 31):
        return 0
    return -res if posi else res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值