String To Integer(atoi)

来源:互联网 发布:岛希斯洛普 知乎 编辑:程序博客网 时间:2024/05/16 05:24

通过率很低的一道easy题,题目难就难在要过滤各种不合理字符串输入(多个正负号、0的处理、义字符、符号插入等等),还要考虑越界问题。我费尽力气解决了输入问题后,屡次出现越界问题,于是怒看解答终于AC。。。

自己的版本老有个case(-2147483647)过不去,但在自己机器上是正确的,无奈。。。也贴上来作为轨迹:

long long tenPower(int power){    long long result = 1;    while (power > 0) {        result *= 10;        power--;    }    return result;}char *strFilter(char *s) // "0123" "-0132" "+0123" "01k23" "094-12" "  - 0100 0 " " 3 345 "{    char *result = NULL;    int sLength = (int)strlen(s);    int count = 0;    bool isSpace = true;    //重新构造一个过滤过的字符串返回    result = (char *)malloc(sLength * sizeof(char));    memset(result, 0, strlen(result));    int index = 0;        for (int i = 0; i < sLength; i++) {        if (s[i] == '+' | s[i] == '-') {            if (count < 1) {                count++;                isSpace = false;                result[index] = s[i];                index++;                continue;            }            else {                break;            }        }        else if (s[i] == ' ') {            if (isSpace) {                continue;            }            else {                break;            }        }        else if (s[i] >= '0' && s[i] <= '9') {            isSpace = false;            result[index] = s[i];            index++;            continue;        }        else {            break;        }    }        return result;}int myAtoi(char *s){    long long result = 0;    int power = 0;    bool isNagtive = false;        char *temps = strFilter(s);    if (temps)        ;    else        return 0;    if (temps[0] == '-')        isNagtive = true;        int sLength = (int)strlen(temps);    for (int i = sLength - 1; i >= 0; i--) { // "0123" "-0132" "+0123" "01k23" "094-12" "  0100" "  345 "        if (temps[i] >= '0' && temps[i] <= '9') {            if (temps[i] == '0') {                power++;            }            else {                if (result < INT_MIN || result > INT_MAX) {                    if (isNagtive)                        result = -result;                    if (result > INT_MAX) {                        result = INT_MAX;                    }                    else if (result < INT_MIN) {                        result = INT_MIN;                    }                    if (isNagtive)                        result = -result;                    break;                }                result = result + (temps[i] - '0') * tenPower(power);                power++;            }        }    }    if (isNagtive)        result = -result;    if (result > INT_MAX) {        result = INT_MAX;    }    else if (result < INT_MIN) {        result = INT_MIN;    }    free(temps);    return (int)result;}

作为一道easy题,上面的代码明显超过长度,尤其是power和过滤函数,其实只要几句话就可以到达目的,只是当时自己的思维还是一个个来单独处理,没有连起来的思维,所以需要继续锻炼。

以下是借鉴的版本,power函数其实用反转integer的关键代码就行,过滤的自己考虑复杂了,其实规律很好找:

int myFixedAtoi(char *s){    int result = 0;    int i = 0;    int sign = 0;    int sLength = (int)strlen(s);        while (i < sLength && s[i] == ' ')        i++;    if (s[i] == '+')        i++;    else if (s[i] == '-') {        i++;        sign = 1;    }    for (; i < sLength; i++) {        if (s[i] < '0' || s[i] > '9')            break;        else if (result > INT32_MAX / 10 || (result == INT32_MAX / 10 && (s[i] - '0') > INT32_MAX % 10)) {            if (!sign)                return INT32_MAX;            else                return INT32_MIN;        }        result = result * 10 + (s[i] - '0');    }    if (sign)        result = -result;        return result;}


0 0