0
点赞
收藏
分享

微信扫一扫

把字符串转换成整数

快乐小鱼儿_9911 2023-05-02 阅读 74

题目:把字符串转换成整数

思路:

如果对于一般规则的数字“字符串”转化为数字都很容易,比如:

对于“123456”可以利用如下代码进行转化:

string str="123456";
int ans = 0;
for (int i=0; i<str.size(); ++i) 
{
    ans = ans * 10 + (str[i] - '0');
}

问: str[i]-'0'是什么意思?

问:ans = ans * 10 + (str[i] - '0')是什么意思?

int的范围为 [-2^{31},2^{31-1}]
如果超过了这两个范围该怎么办?
其实也很简单,首先判断这个数的正负,如果正数,超过了INT_MAX,就设置为INT_MAX,如果是负数,首先我们不考虑负号,如果超过了INT_MAX+1, 则就置为INT_MAX+1, 最后再根据正负号,来加负号。

//判断正负
bool neg = str[i]=='-' ? true : false;
//判断该下标对应的字符是否是数字
//如果是,就i=i
//如果否,就i=i+1,往后挪一位
i = isdigit(str[i]) ? i : i+1;

long long ans = 0L; // 因为INT_MAX+1超过了int的范围

while (i < len && isdigit(str[i])) {
    ans = ans * 10 + (str[i++]-'0');

    if (!neg && ans > INT_MAX) {
        ans = INT_MAX;
        break; //因为此处以为最大值,所以直接break
    }
    if (neg && ans > 1L + INT_MAX) {
        ans = 1L + INT_MAX;
        break;
    }
}

long long ans = 0L;是什么意思?

最后再考虑一些特殊情况即可。

class Solution
{
public:
    int StrToInt(string str)
    {
        const int len = str.length();
        if (len == 0) return 0;
        int i = 0;
        while (i < len && str[i] == ' ') { ++i; } // 排除开头的空格
        if (i == len) return 0;
        if (!isdigit(str[i]) && str[i] != '+' && str[i] != '-') return 0;
        bool neg = str[i] == '-' ? true : false;
        i = isdigit(str[i]) ? i : i + 1;
        long long ans = 0L;

        while (i < len && isdigit(str[i]))
        {
            ans = ans * 10 + (str[i++] - '0');

            if (!neg && ans > INT_MAX)
            {
                ans = INT_MAX;
                break;
            }
            if (neg && ans > 1L + INT_MAX) {
                ans = 1L + INT_MAX;
                break;
            }
        }
        if (i != len) return 0; // 不要此处,就是atoi()库函数的实现
        return !neg ? static_cast<int>(ans) : static_cast<int>(-ans);
    }
};

这段代码实现了将字符串转换成整数的功能,其流程如下:

  1. 首先判断输入字符串是否为空串,如果是,则直接返回0;
  2. 接着排除开头的空格符;
  3. 如果剩余字符中不是数字字符也不是正号或负号,则认为输入不合法,返回0;
  4. 确定正负性,如果是负数,则标记neg为true;
  5. 从第一位开始,取出连续的整数子串,并将其转换成整数。如果超过int类型能表示的范围,进行相应处理;
  6. 最后根据正负标志返回对应整数。

这段代码完善地考虑了各种异常情况,比如前导空格、加减号位置、多余字符等,使用了long long类型来避免数据溢出等问题。同时,代码结构清晰,变量名具有描述性,易于理解和调试。

 

举报

相关推荐

0 条评论