String to Integer (atoi) - Leetcode

26 篇文章 0 订阅

题意:编写一个函数将字符串中的数字转换成数字。
要求:
能提取出数字的情况:
1.“ 32345”前面有空格
2.“ -39405”前面有正负号
3.“ 382ab4”数字后面出现有其他字符的,则只提取之前的数字
4. 提取的数字超出整型数的表示范围,则输出INT_MAX或者INT_MIN
不能提取出数字的情况:
1.字符串中只有空格或者字符串为空,返回0;
2.数字前面出现两个以上的正负号或者数字前面出现其他字符,返回0
本题难易程度为easy,主要是要考虑到说有可能出现的情况。

int myAtoi(string str) {
    int num[1000];
    for (int k = 0; k < 1000; k++)
        num[k] = 0;
    int flag1=1,flag2=0;//记录'+'和'-'接连出现的次数
    string::iterator it = str.begin();
    //舍弃掉字符串前面的空格
    while (it < str.end())
    {
        if (*it != ' ') break;
        it++;
    }
    if (it == str.end() || str.size() == 0) return 0;   //全是空格或者字符串为空,返回0
    int i = 0, n = 0;
    while (it != str.end())
    {
        n = *it++;
        if (n == 43) flag1++;
        else if (n == 45) flag2++;
        else if (n >= 48 && n <= 57) break;
        else return 0;//遇到数字之前只要遇到不该出现的字符,就返回0
    }
    //由于跳出循环有两种情况。一种是遇到数字字符break了,另一种是直到字符串遍历结束只有正负符号。
    if (flag1 > 2 || flag2 > 1 || (flag1 == 2 && flag2 == 1)) return 0;//数字前面有多个符号
    if (it == str.end() &&(n < 48 || n>57)) return 0;//字符串中只有符号并没有数字
    num[i++] = n - 48;
    while (it != str.end())
    {
        n = *it++;
        //在数字后面出现其他字符,就跳出循环,最后所得数字就是此前提取的数字
        if (n < 48 || n>57) break; 
        num[i++] = n - 48;
    }
    long long number = 0;
    int j = 0;
    while (j<i)
    {
        number = number * 10 + num[j++];
        //每添加一位数字则判断number有没有越界。
        //如果等到存完数据再判断是否越界,因为尽管number是long long型的,
        //但是存入的数字也有越界的可能,越界后符号会改变值也变了,就无法判断了。
        if (flag2 == 0 && number>2147483647) return 2147483647;  
        else if(flag2==1 && number>2147483648) return -2147483648;
    }

    return flag2 ? -number : number;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值