8. String to Integer (atoi)

8. String to Integer (atoi)
Difficulty: Easy
实现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.

步骤:
1.去掉多余的空格字符
2.读+、-符号(正数可能没有符号)
3.结束条件:异常字符出现(将异常字符起的后面截去,保留前面的部分);数字越界(返回最接近的整数);字符串结束

注意:
1.int型范围:-2147483648~-2147483647
2.ASCII码:
‘0’~’9’ 48~57
’ ’ 0
‘+’ 43
‘-’ 45

细节分析:
例如:
“+10” 10
” 010” 10
” -0012a42” -12
“a1” 0
“-12+10” -12
“0+10” 0
“+ 13” 0
“1 5” 1
“2147483648” “2147483647”
“-2147483649” “-2147483648”

1.数字前面有空格 如s=“ 123456”
2.数字前出现了不必要或多于的字符导致数字认证错误,输出0 如s=“ b1234” ,s=“ ++1233” , s=“ +-1121”
3.数字中出现了不必要的字符,返回字符前的数字 如s=“ 12a12” , s=“ 123 123”
4.数字越界 超过了范围(-2147483648–2147483647) 若超过了负数的 输出-2147483648 超过了正数的输出2147483647
在科普一个知识点,倘若某个数超过了2147483647则会变为负数,反过来一样
这道题主要考察整数处理,注意点上面已经提到过,因为这个问题是C语言的一个基本问题,面试中还是有可能出现,相对比较底层,边缘情况的处理是关键,可能面试tester的职位会更常见一些。

int myAtoi(char* str)  {
    int i,k,m;
    int len=strlen(str);
    int retint;
    int sign=-1;
    int* arrayInt=(int*)malloc(len*sizeof(int));

    //sign=0,出现数字;sign=1,出现正号;sign=2,出现负号
    m=0;
    for(i=0;i<len;i++)
    {
        if(str[i]<48 || str[i]>57)  //不是数字
        {
            if(sign==-1)
            {
                if(str[i]==' ')
                    continue;
                else if(str[i]=='+')
                   sign=1;
               else if(str[i]=='-')
                   sign=2;
               else   //若首先出现其它符号,返回0
               {
                   free(arrayInt);
                   return 0;
               }
            }
            else    //sign!=-1,已经出现过数字或正负号,再出现数字外的符号(包括空格),截止
           {
               break;
           }
        }
        else    //是数字
        {
            if(sign==-1)
                sign=0;
            arrayInt[m]=str[i]-'0';
            m++;    //m记录数的位数
        }
    }
    retint=0;
    k=m-1;
    for(i=0;i<m;i++)
    {
        retint+=arrayInt[i]*pow((float)10,k);
        k--;    
        if(retint<0)    //溢出
            break;
    }
    free(arrayInt);

    if(sign==2 && retint<0)   //负数溢出,返回-2147483648
        return 2147483647+1;
    else if(retint<0)        //正数溢出,返回2147483647
        return 2147483647;
    else if(sign==2)     //负数
        return -retint;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值