LeetCode8 String to Integer(stoi)

LeetCode8 String to Integer(stoi)

题目

Implement atoi to convert a string to an integer.

题目要求

  • 该函数首先丢弃尽可能多的空白字符,直到找到第一个非空白字符。
    那么,从这个字符开始,可选的初始加号或减号后面跟随尽可能多的数字,并将它们解释为数字值。

  • 该字符串可以在形成整数的那些字符之后包含附加字符,这些字符被忽略并且对该函数的行为没有影响。

  • 如果str中的第一个非空白字符序列不是有效整数,或者如果由于str为空或仅包含空白字符而不存在此类序列,则不执行转换。

  • 如果不能执行有效的转换,则返回零值。
    如果正确的值超出了可表示值的范围,则返回int_max(2147483647)或int_min(-2147483648)。

atoi的百度百科解释

int atoi(const char *nptr) 函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进)等,直到遇上数字或正负符号才开始做转换,而在遇到非数字或字符串结束时(‘\0’)才结束转换,并将结果返回。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0。

C++ reference中atoi 对超出integer范围的返回值解释

如果转换后的值超出int的可表示范围,则会导致未定义的行为。但在本题中要求输出INT_MAX或INT_MIN

解题提炼(需要注意的点)

  • 若输入字符串为空,则输出0;

  • 若输入第一个非空字符不是正负号或数字,则返回0;

  • 若输入+/-后面为非数字,则输出0;

  • 若输入的数格式合法,但超出了INT_MAX或INT_MIN。如果为正数,则输出INT_MAX;若为负数,则输出为INT_MIN

代码


class Solution {
public:
    int myAtoi(string str) {
        if(str.empty()) return 0; //特判空串
        long long result = 0;
        int start;

        for(start = 0;start<str.size();start++){//去除开始的空白字符
            if(!isspace(str[start])) break;
        }

        int flag = false;//false表示为正数 

        if(start<str.size()){   //该分支判断:如果字符串仅有空白字符则返回0,否则进行下面的操作
            if(str[start]=='+'||str[start]=='-'||isdigit(str[start])){
                if(str[start]=='-'){ //如果首先搜索到负号,则将flag设为true
                    flag = true; 
                }
                if(!isdigit(str[start])){ //如果首先搜索到的是正负号,则将start++
                    start++;
                    if(!isdigit(str[start])) return 0;//判断正负号后面是否为数字,如果不是数字返回0,否则继续下面的操作
                }

                for(int i = start;i<str.size();i++){//循环计算,直到遇到非数字或字符串末尾结束
                    if(!isdigit(str[i])) break;
                    result = result*10+str[i]-'0';
                    if(result>1ll<<31) break; //为防止result(long long)溢出,当result超出Integer的范围之后跳出循环
                }

                if(!flag&&result>INT_MAX) return INT_MAX;//如果为正数超出INT_MAX,返回INT_MAX
                if(flag&&result>1ll<<31) return INT_MIN;//如果为负数超出INT_MIN,返回INT_MIN
                if(flag) result *= -1;
                return result;
            }else{
                return 0;
            }
        }else{
            return 0;
        }
    }
};


猜你喜欢

转载自blog.csdn.net/deep_kang/article/details/79622363
今日推荐