Leetcode 第8题 String to Integer (atoi)

题目: String to Integer (atoi)

  • Implement atoi to convert a string to an integer.

    Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

    Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

    Update (2015-02-10):
    The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button to reset your code definition.


题目分析:

  • 题目的含义是将一个字符串转化为数字,里面包含各种情况,需要分开进行讨论并最终转化为正确的数字

思路:

  • 举例:例如’ ’ 结果是0 ’ 12a89’结果是12 ’ +128gh’结果是128 ’ -78bg90’结果是-78
  • 主要分为如下情况:如果字符串开头是空格,那么就将所有的空格都忽略;如果空格过后出现了正号或者是负号,就用标志来记录正负号;如果正负号或者空格过后是数字那么得到的就是数字;如果数字之后出现字母那么就可以直接返回数字了;每次数字都需要判断是否溢出,需要进行溢出处理

代码:

  • C++:
//将字符串转化为整型数字 例如'  ab12' 这个结果数字是0  '  12b'结果是12  数字前面只能是空格或者正负号那么这个结果才是数字,否则结果都是0
class Solution {
public:
    int myAtoi(string str) {
        //如果是空字符串直接返回NULL
        if(str.length()==0)
            return 0;
        int i=0;
        while(str[i]!='\0' && str[i]==' ')//如果字符串未到结尾并且前面是空格,忽空格
        {
            i++;
        }
        //如果去掉空格后字符串为空了,那么返回0
        if(str[i]=='\0')
            return 0;

        int flag=1;//标志是正号还是负号 
        long long res=0;//最后的结果数字
        //如果出现正负号的处理
        if(str[i]=='+')//如果出现的是正号 那么将flag置为1
        {
            flag=1;
            i++;
        }
        else if(str[i]=='-')//如果出现的是正号 那么将flag置为-1
        {
            flag=-1;
            i++;
        }

        while(str[i]!='\0')//如果此时字符串不是空
        {
            if(str[i]>='0' && str[i]<='9')//如果出现了字符是0到9之间的数字
            {
                if(flag==-1)//如果前面出现的是+号
                {
                    res=res*10-(str[i]-'0');
                }
                else
                {
                    res=res*10+(str[i]-'0');
                }
            }
            else//如果此时字符不是0到9之间的数字,返回数字 例如‘  -12ab34’ 这个返回结果应该是-12
            {
                return res;
            }

            //如果前面的字符都是数字,每次都需要检验数字的范围是否超出了
            if(res>2147483647)
            {
                return 2147483647;
            }
            else if(res<-2147483648)
            {
                return -2147483648;
            }

            i++;
        }
        return res;
    }
};

  • Javascript:
/**
 * @param {string} str
 * @return {number}
 */
var myAtoi = function(str) {
    if(str.length==0)//如果字符串长度是0 那么返回数字0
    {
        return 0;
    }
    var i=0;
    var arr=str.split("");//将字符串放入数组中
    var l=arr.length;//数组长度也就是字符串的长度

    while(i<l && arr[i]==" ")//如果前面是空格,将空格都删掉
    {
        i++;
    }

    if(i==l)//如果空格去除后数组中没有元素了那么返回数字0  例如'    ' 结果是0
    {
        return 0;
    }

    var res=0;//最后的储存结果
    var flag=1;//正负号的标志
    if(arr[i]=="+")
    {
        flag=1;
        i++;
    }
    else if(arr[i]=="-")
    {
        flag=-1;
        i++;
    }

    while(i<l)
    {
        if(arr[i].charCodeAt()>=48 && arr[i].charCodeAt()<=57)//如果数字是在0到9之间
        {
            res=res*10+flag*parseInt(arr[i]);
        }
        else
        {
            return res;
        }
        if(res>2147483647)
        {
            return 2147483647;
        }
        else if(res<-2147483648)
        {
            return -2147483648;
        }
        i++;
    }
    return res;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值