剑指offer49_把字符串转换成整数_题解

把字符串转换成整数

题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

示例1

输入

"+2147483647"

返回值

2147483647

示例1

输入

"1a33"

返回值

0

分析

方案一:遍历

根据题意,有以下四种字符需要考虑:

  • 首部空格: 删除之即可;
  • 符号位: 三种情况,即 ''+'' , ''−'' , ''无符号" ;新建一个变量保存符号位,返回前判断正负即可。
  • 非数字字符: 遇到首个非数字的字符时,应立即返回。
  • 数字字符:
    • 字符转数字:\(str[i]-'0'\)
    • 数字拼接:\(ans=ans*10+(str[i]-'0')\)

此外,还需要考虑数字越界,正数越界返回 \(INT\_MAX\),负数越界返回 \(INT\_MIN\)

代码

/**
1.时间复杂度:O(n) 
2.空间复杂度:O(n)
**/
class Solution
{
public:
    int StrToInt(string str)
    {
        int len = str.length();
        if (len == 0) // 如果字符串为空串,返回0
            return 0;
        int i = 0;
        while (i < len && str[i] == ' ') // 寻找第一个非空字符
            ++i;
        if (i == len) // 如果字符串中的字符全为空格,则返回0
            return 0;
        if (!isdigit(str[i]) && str[i] != '+' && str[i] != '-') // 如果第一个非空字符不是数字也不是正负号,则返回0
            return 0;
        bool symbol = str[i] == '-' ? true : false; // 记录数字正负,如果第一个非空字符为负号,则为负数,否则为正数
        if (!isdigit(str[i]))                        // 如果第一个非空字符不是数字,则下标i + 1指向下一个字符
            i++;
        long long ans = 0L;
        while (i < len && isdigit(str[i]))
        {
            ans = ans * 10 + (str[i++] - '0');
            if (!symbol && ans > INT_MAX) // 如果超过正数表示的最大范围,则返回INT_MAX
                return INT_MAX;
            if (symbol && ans > 1L + INT_MAX) // 如果超过负数表示的最大范围,则返回INT_MIN
                return INT_MIN;
        }
        if (i != len) // 如果有非法字符,则返回0
            return 0;
        return !symbol ? ans : -ans;
    }
};
posted @ 2021-01-24 20:45  RiverCold  阅读(62)  评论(0编辑  收藏  举报