首页 > 试题广场 >

把字符串转换成整数(atoi)

[编程题]把字符串转换成整数(atoi)
  • 热度指数:59339 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
1.若干空格
2.(可选)一个符号字符('+' 或 '-')
3. 数字,字母,符号,空格组成的字符串表达式
4. 若干空格

转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
3.3  整数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231的整数应该被调整为 −231 ,大于 231 − 1 的整数应该被调整为 231 − 1
4.去掉无用的后导空格


数据范围:
1.0 <=字符串长度<= 100
2.字符串由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成


示例1

输入

"82"

输出

82
示例2

输入

"   -12  "

输出

-12

说明

去掉前后的空格,为-12  
示例3

输入

"4396 clearlove"

输出

4396

说明

6后面的字符不属于有效的整数部分,去除,但是返回前面提取的有效部分  
示例4

输入

"clearlove 4396"

输出

0
示例5

输入

"-987654321111"

输出

-2147483648
为什么感觉你们写的好复杂啊
#define MAX_BOUNDARY 2147483647
#define MIN_BOUNDARY -2147483648
int StrToInt(char* s ) {
    // write code here
    int sign = 1;
    int i =0;long ret=0;
    int len = strlen(s);
    while(i<len)
    {
        while(i<len && s[i]==' ')
            i++;
        if(i<len && s[i] == '+')
            ++i;
        else if(i<len && s[i]=='-')
        {
            sign = -1;
            ++i;
        }   
        while(i<len && s[i]>='0' &&s[i]<='9')
        {
            ret=ret*10+s[i++]-'0';
            if(ret>MAX_BOUNDARY)
            {    
                ret = MIN_BOUNDARY*-1;
                break;
            }
        }
        if(i<len && s[i]<'0'||s[i]>'9')
            break;
    }
    ret*=sign;
    if(ret>MAX_BOUNDARY)
        ret = MAX_BOUNDARY;
    else if(ret <MIN_BOUNDARY)
        ret = MIN_BOUNDARY;
    return (int)ret;
}


发表于 2023-06-14 22:29:37 回复(0)
#define MAX 2147483648
#define INT_MAX 2147483647
#define INT_MIN -2147483648
int StrToInt(char* s ) {
    // write code here
    int result;
    int len=strlen(s);
    int n=0,j=0;
    long sum=0;
    for(int i=0;i<len;i++)
    {
        if(s[i]=='-'&&n==0) n=-1;
        else if(s[i]=='+'&&n==0) n=1;
        else if(s[i]==' '&&n==0) continue;
        else if(s[i]>='0'&&s[i]<='9') 
        {
            sum=sum*10+(s[i]-'0');
            if(n==0) n=1;
            if(sum>MAX) sum=MAX;
        }
        else break;
    }
    if(n==0) n=1;
    if(sum==MAX&&n==1) sum=INT_MAX; 
    else if(sum==MAX&&n==-1) sum=INT_MIN;
    else sum=n*sum;
    result=(int)sum;
    return result;
}
发表于 2022-08-31 15:08:09 回复(0)
double convert(char* s, int len)
{
    double sum = 0;int i=0;
    while (--len >= 0)
    {
        sum += (*(s + len) - '0')*pow(10, i);
        i++;
    }
    return sum;
}
int StrToInt(char* s) 
{
    if (s == NULL)
        return 0;
char* a = s;
    while (*a == ' ')
        a++;
    if (a == NULL)
        return 0;
    if ((*a >= 'a' && *a <= 'z') || (*a >= 'A' && *a <= 'Z'))
        return 0;
    char* first=a;
    if (*a == '+'||*a=='-')
    {
        a++;
        if (*a < '0' || *a>'9')
            return 0;
        int i = 0;
        
        while (*a == '0')
            a++;
        if (a == NULL)
            return 0;
        first = a;
        while (*a > '0' && *a <= '9')
        {
            a++;
            i++;
        }
        if (*s == '+')
        {
            if (convert(first, i)< pow(2, 31) - 1)
                return convert(first, i);
            else
                return pow(2,31)-1;
        }
            
        else
        {
            if (-convert(first, i)> -pow(2, 31))
                return -convert(first, i);
            else
                return -pow(2, 31) ;
        }    
    }

    if (*a >= '0' && *a <= '9')
    {
        int i = 0;
        first = a;
        while (*a >= '0' && *a <= '9')
        {
            a++;
            i++;
        }
        if (convert(first, i)< pow(2, 31) - 1)
                return convert(first, i);
            else
                return pow(2,31)-1;
    }
    return 0;
}
发表于 2022-03-23 12:37:30 回复(0)

问题信息

上传者:牛客301499号
难度:
3条回答 3263浏览

热门推荐

通过挑战的用户