《leetCode》:Convert String to Integer

题目描述

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)str="123"
2)str="0123"
3)str="+123"
4)str="-123"
5)str="+0123"
6)str="-0123"
7)特殊输入:NULL 

没有考虑到的测试用例
1)str="    010";或str="010      ";含空格的情况。处理方法:将字符串的前后空格去除了 


还没有考虑的测试用例
1)str="           -012a34";输出-12 


还没有考虑到的测试用例
1)str="2147483647",正整数中最大值
2)str="- 2147483647",最大负整数

还没有考虑到的测试用例
1) str="9223372036854775809"
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
#include<math.h>

void trimStr(char *str,int *begin,int *end) {
    *begin=0;
    *end=0;
    if(str==NULL||str==""){
        return;
    }
    int index=0;

    while(str[index]!='\0'){
        if(str[index]!=' '){
            break;
        }
        index++;
    }
    *begin=index;
    //先判断第一个非数字字符是否为  +/-号 
    if(str[index]=='+'||str[index]=='-'){
        index++;
    } 
    while(str[index]!='\0'){
        if(str[index]==' '){
            break;
        }

        int temp=str[index]-'0';
        if(temp<0||temp>9){
            break;
        } 
        index++;
    }
    *end=index;
}
int myAtoi(char* str) {
    if(str==NULL||str==""){
        return 0;
    } 
    int begin=0;//用来指示第一个不是空格的索引; 
    int end=0;//用来表示最后一个不是空格后一位的索引 
    trimStr(str,&begin,&end);
    //先判断下str的第一个字符是否为“+”或者是“-”号
    int symbol=1;
    int start=begin;
    if(str[begin]=='+'){
        symbol=1;
        start=begin+1;
    } 
    if(str[begin]=='-'){
        symbol=-1;
        start=begin+1; 
    }
    int pow2Val=pow(2,31);
    if(start==end){//只含有加减号的字符串。 
        return 0;
    }
    if(end-start>11){
        if(symbol==1)
            return pow2Val;
        else{
            return (-1)*pow2Val-1;
        }
    }
    long long result=0;//用来保存结果 ,也要考虑是否溢出,因此设为long型 
    for(int i=start;i<end;i++){
        int temp=str[i]-'0';
        if(temp<0||temp>9){//检测每个字符是否在 '0'到'9'之间 
            return 0;
        }
        result=result*10+temp;
    }


    if(result>=pow2Val&&symbol==1){//正整数溢出了 ,返回最大正整数值 
        return pow2Val;
    }
    else if(result>pow2Val&&symbol==-1){//负整数溢出了 ,返回小负整数值
        return  (-1)*pow2Val-1;
    } 
    else{   
        return (int)(symbol*result);

    } 

}

int main(void){
//  printf("%d",sizeof(long long));
    //char str[1000];
    //while(gets(str)){
    char *    str="9223372036854775809";//2^31-1,即int类型最大的正整数 
        int result=myAtoi(str);
        printf("%d\n",result);
//  }
}

经过千辛万苦,终于AC了

程序的思想很简单,但是这个题目背后的测试用例比较变态。

例如

str=”9223372036854775809”,返回正整数的最大值
str=”最大正整数“+1,返回正整数的最大值。

本来刚开始写的代码是统一将溢出的,返回零值,但是别人测试平台有这个要求,我们也没有办法。

遇到的一些问题截图如下:
1)没有考虑空格

解决方法:写了一个找到字符串第一个不是空格的索引begin和最后一个字符再后一个位置的索引end。

2)没有考虑需要有这个测试用例

解决方法:在第一个问题的基础上,将获取最后一个字符再后一个位置的索引end。—–》修改为获取第一个字符不是”0“~”9“的索引

3)下面几种就是几种溢出的情况,测试平台要求输出最大正值或负值


解决方法:加几个if判断下然后输出即可。

小结

完成整个题目花的时间也挺长的,测试用例还过于变态。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值