欢迎访问宙启技术站
智能推送

字符串转化为整数(模拟实现atui)

发布时间:2023-05-16 05:43:12

题目描述

给定一个字符串,该字符串表示一个整数,现在需要将该字符串转化为整数输出。其中字符串中可能含有空格,正负号以及数字。

要求:

1. 若字符串中存在无效字符,则返回0;

2. 若字符串中的整数超出了int类型的取值范围,则返回INT_MAX或INT_MIN。

解题思路

该题是一道较为基础的模拟题,需要考虑多种情况:

1. 字符串为空或长度为0,则直接返回0;

2. 若字符串中存在空格,则需要将空格去除,再进行转化;

3. 考虑正负号的情况,需要进行特殊处理;

4. 循环遍历字符串中的每一个字符,将其转化为数字,判断是否超出了int类型的取值范围。

5. 最后返回该整数的结果。

具体实现

代码如下:

#include <iostream>
#include <string>
#include <limits.h>
using namespace std;

class Solution {
public:
    int myAtoi(string str) {
        if(str.empty()) return 0; //字符串为空
        int n=str.length(), i=0, sign=1;
        long res=0;
        while(i<n && str[i]==' ') i++; //去除空格
        if(i<n && (str[i]=='+' || str[i]=='-')){ //处理正负号
            sign=(str[i++]=='+')?1:-1; //i++表示取出正负号后的数字
        }
        while(i<n && isdigit(str[i])){ //转化数字
            res=res*10+(str[i++]-'0');
            if(res*sign > INT_MAX) return INT_MAX; //超出最大范围
            if(res*sign < INT_MIN) return INT_MIN; //超出最小范围
        }
        return res*sign;
    }
};

int main() {
    string s = "  -42";
    Solution solution;
    cout << solution.myAtoi(s) << endl;
    return 0;
}

解释:

1. 初始化字符串长度n、指针i和符号sign(默认为正号),结果res为long类型,后面还需要进行处理。

2. while循环去除字符串中的空格。

3. if处理正负号,并将指针i移到数字的 位。

4. while循环将字符转化为数字,并进行判断是否超出了int类型的取值范围。

5. 最后返回结果的值。

增强版

接下来我们考虑增强版的题目:LeetCode-8,需要支持更多的情况转化为整数:

- 字符串前缀空格

- 字符串前缀 +/- 号

- 个非空字符不是数字

- 处理范围,转化后的整数若超出整型范围,返回其最大或最小值

这里几个注意事项:

- 字符串为空,返回0

- 若遇到无效字符,停止转化,返回目前的转化结果

- 去掉前缀空格之后,且 个非空字符不是数字,也返回0。

代码如下:

class Solution {
public:
    int myAtoi(string s) {
        int i=0,len=s.size(),ans=0,sign=1;

        //处理字符串前缀空格
        while(i<len && s[i]==' ') i++;

        //字符串为空或空格,返回0
        if(i==len) return 0;

        //处理前缀符号
        if(s[i]=='+' || s[i]=='-'){
            if(s[i]=='-') sign=-1;
            i++;
        }

        while(i<len){
            //      个非空字符不是数字,结束转化,返回结果
            if(!isdigit(s[i])) return sign*ans;
            int tmp=s[i]-'0'; //将字符转化为数字
            //判断是否超过整型最大值
            if(sign==1 && ans>INT_MAX/10) return INT_MAX;
            if(sign==1 && ans==INT_MAX/10 && tmp>7) return INT_MAX;
            //判断是否超过整型最小值
            if(sign==-1 && ans>INT_MAX/10) return INT_MIN;
            if(sign==-1 && ans==INT_MAX/10 && tmp>8) return INT_MIN;            
            ans=ans*10+tmp;
            i++;
        }
        return sign*ans;
    }
};

总结:

该题是一道较为基础的模拟题,需要考虑多种情况:空格、正负号以及数字等。处理好每一个细节,就能够完成本题。另外增强版的LeetCode-8,需要更多的细节判断,但是针对这些细节的判断,只需要增加少量代码就可以实现。