数据结构和算法经典100题-第20题

第20题:
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。
例如输入字符串”345”,则输出整数345。


题目分析:
题目分析,此题看起来简单,类似于C语言库函数atoi()但是其实一点也不简单;
我们分析一下需要都考虑哪些元素:

1.输入字符串中出现符号‘+’ | ‘-’,出现符号‘+’不处理,出现符合‘-’将输出整数转为负数;
2.字符串中出现非法字符,若字符串中出现非法字符,则返回错误;
3.字符串结束,以‘\0’视作输入字符串结束,若第一个出现的字符就是‘\0’,那么返回错误;
4.字符串超长问题,若输入字符串转换为整数过程中超过long long那么返回错误;
5.将字符串转换为整数的方法,一个字符一个字符读取,每次做*10操作;
6.字符串以0开头,后边跟其它数字的情况。


代码:

typedef struct _Error {
    int errorNo;
    std::string errorInfo;
}Error;

int Atoi(char * str, Error &error) {
    char *tmp = str;
    long long value = 0;
    bool isNegative = false;
    error.errorNo = 0;

    /* 处理输入字符串为空的情况 */
    if (NULL == str) {
        error.errorNo = -1;
        error.errorInfo = "The input string is empty!";
        return -1;
    }

    /* 处理输入第一个字符为'\0'的情况 */
    if ('\0' == *tmp) {
        error.errorNo = -2;
        error.errorInfo = "The input string is illegal!";
        return -1;

    }

    /* 处理输入字符串是负数的情况 */
    if ('-' == *tmp) {
        isNegative = true;
        tmp++;
    }

    /* 处理输入字符串中出现'+'的情况 */
    if ('+' == *tmp) {
        tmp++;
        if ('\0' == *tmp) {
            error.errorNo = -1;
            error.errorInfo = "The input string is illegal!";
            return -1;
        }
    }

    /* 处理以0开头,后边根其它数字的情况 */
    if ('0' == *tmp && '\0' != str[2]) {
        error.errorNo = -2;
        error.errorInfo = "The input string is illegal!";
        return -1;
    }

    while ('\0' != *tmp) {
        if ('9' < *tmp || '0' > *tmp) {
            error.errorNo = -3;
            error.errorInfo = "The input string is illegal!";
            return -1;
        } else {
            value = value * 10 + (*tmp - '0');

            /* 处理超过整数长度的情况 */
            if (value > std::numeric_limits<int>::max()) {

                error.errorNo = -4;
                error.errorInfo = "The number Overflow!";
                return -1;
            }
        }

        tmp++;
    }


    return (isNegative) ? (int)(0 - value) : (int) value;
}

对上面的代码做单元测试,测试程序如下:

int test_20() {

    Error error;

    printf("Test case 1 : input 123456,  output %d\n",Atoi((char*)"123456", error));
    printf("Test case 2 : input -123456, output %d\n",Atoi((char*)"-123456", error));
    printf("Test case 3 : input abcd, output %d\n",Atoi((char*)"abcd", error));
    printf("Test case 4 : input +12345, output %d\n",Atoi((char*)"+12345", error));
    printf("Test case 5 : input '', output %d\n",Atoi((char*)"", error));
    printf("Test case 6 : input NULL, output %d\n",Atoi(NULL, error));
    printf("Test case 7 : input 123456789123455, output %d\n",Atoi((char*)"123456789012345", error));

    if (error.errorNo != 0) {
        cout<<"error no   = "<<error.errorNo<<endl;
        cout<<"error info = "<<error.errorInfo<<endl;
    }


    return 0;
}

#include "20th.h"
int main(int argc, const char * argv[]) {

//    test_1();
//    test_2();
//    test_3();
//    test_4();
//    maxHeap_test();
//    test_5_1();
//    test_7();
//    test_9();
//    test_10();
//    test_11();
//    test_13();
//    test_14();
//    test_15();
//    test_17();
    test_20();
    return 0;
}


测试结果:

Test case 1 : input 123456,  output 123456
Test case 2 : input -123456, output -123456
Test case 3 : input abcd, output -1
Test case 4 : input +12345, output 12345
Test case 5 : input '', output -1
Test case 6 : input NULL, output -1
Test case 7 : input 123456789123455, output -1
error no   = -4
error info = The number Overflow!
Program ended with exit code: 0

Okay,前二十题总算解完了,这个系列完成20%了,更新的有点慢了最近。下面开始第21题到100题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值