实现功能(atoi)

将字符串转化为int型整数:

1.当字符串中第一个数字之前既不是正负号也不是空格时,直接返回0。如“dakks   34”

2.当字符串中数据的大小超过整数的范围时,返回int能表示的最大值或最小值。

3.当遇到“+-333”时返回0。

 

先上自己的代码:


#define INT_MAX         (2147483647)
#define INT_MIN         (-2147483648)

int myAtoi(char* str) {
    int len = strlen(str); // 传进来的字串长度
    int i = 0; // 轮询字符串总长度
    int found = 0; // 用来表示是否找到第一个数字或符号
    long num = 0; 
    int plus_minus = 0;  // 用来表示找到的数字的正负号
    //printf("len = %d\r\n",len);
    
    while(i < len)
    {
        if((found == 0)&&(str[i] == ' '))
        {
            // 未找到数字之前,空格直接跳过
            i++;
            //printf("space\r\n");
            continue;
        }
        
        if((str[i] >= '0')&&(str[i] <= '9'))
        {
            found = 1;
            // 判断是否超过正数的最大值
            if((plus_minus == 0)&&((num * 10+(str[i]-'0')) > INT_MAX))
            {
                //printf("return int max\r\n");
                return INT_MAX;
            }
            // 判断是否超过负数的最小值
            else if((plus_minus == 1)&&((num * 10 - (str[i]-'0')) < INT_MIN))
            {
                //printf("return int min\r\n");
                return INT_MIN;
            }
            
            if(plus_minus == 0)
            {
                num = num * 10 + (str[i]-'0');    
            }
            else
            {
                num = num * 10 - (str[i]-'0');
            }
            //printf("num = %d,n = %d,plus_minus = %d,MAX = %d,MIN = %d\r\n",num,(str[i]-'0'),plus_minus,INT_MAX,INT_MIN);
        }
        else if(found == 1)
        {
            //printf("unuse char ,%c\r\n",str[i]);
            return (int)num;
        }
        else if((found == 0)&&(str[i] != '-')&&(str[i] != '+'))
        {
            //printf("unuse char ,%c\r\n",str[i]);
            return (int)num;
        }
    
        if((found == 0)&&(str[i] == '+'))
        {
            found = 1;
        }
        
        if((found == 0)&&(str[i] == '-'))
        {
            plus_minus = 1;
            found = 1;
        }
        i++;
    }
    
    return (int)num;
}

leetcode给出的参考代码(至少代码的简洁程度上要比我自己的好很多,虽然执行的时间一样(可能是因为功能比较简单吧)):

bool isSign(char c)
{
    return (c=='+' || c=='-');
}

bool isDigit(char c)
{
    return (c>='0' && c<='9');
}

int myAtoi(char* str) {
    int idx=0, rst=0; 
    long sign=0, num=0;
    
    if(NULL != str)
    {
        while(str[idx])
        {
            if((num*sign) >= INT_MAX || (num*sign) <= INT_MIN)
            {
                break;
            }
            
            if(isDigit(str[idx]))
            {
                num = num*10 + str[idx] - '0';
                sign = sign==0 ? 1 : sign;
            }
            else
            {
                if(num==0 && sign==0)
                {
                    switch(str[idx])
                    {
                        case '+': sign=1;   break;
                        case '-': sign=-1;  break;
                        case ' ': break;                        //skip space
                        default:  idx = strlen(str)-1; break;   //stop and return 0
                    }
                }
                else
                    break;
            }

            idx++;
        }
    }

    rst =  (num*sign >= INT_MAX) ? INT_MAX : (num*sign <= INT_MIN ? INT_MIN : (int)(num & 0x000000007FFFFFFF)*sign);
    
    return rst;
}

题目和参考代码来自:https://leetcode.com/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值