1. 程式人生 > >LeetCode--[字串]8. 字串轉整數 (atoi)

LeetCode--[字串]8. 字串轉整數 (atoi)

實現 atoi,將字串轉為整數。

在找到第一個非空字元之前,需要移除掉字串中的空格字元。如果第一個非空字元是正號或負號,選取該符號,並將其與後面儘可能多的連續的數字組合起來,這部分字元即為整數的值。如果第一個非空字元是數字,則直接將其與之後連續的數字字元組合起來,形成整數。

字串可以在形成整數的字元後面包括多餘的字元,這些字元可以被忽略,它們對於函式沒有影響。

當字串中的第一個非空字元序列不是個有效的整數;或字串為空;或字串僅包含空白字元時,則不進行轉換。

若函式不能執行有效的轉換,返回 0。

說明:

假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231, 231 − 1]。如果數值超過可表示的範圍,則返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

輸入: “42”
輸出: 42
示例 2:

輸入: ” -42”
輸出: -42
解釋: 第一個非空白字元為 ‘-‘, 它是一個負號。
我們儘可能將負號與後面所有連續出現的數字組合起來,最後得到 -42 。
示例 3:

輸入: “4193 with words”
輸出: 4193
解釋: 轉換截止於數字 ‘3’ ,因為它的下一個字元不為數字。
示例 4:

輸入: “words and 987”
輸出: 0
解釋: 第一個非空字元是 ‘w’, 但它不是數字或正、負號。
因此無法執行有效的轉換。
示例 5:

輸入: “-91283472332”
輸出: -2147483648
解釋: 數字 “-91283472332” 超過 32 位有符號整數範圍。
因此返回 INT_MIN (−231) 。

解答

注意一些特殊的輸入:
1.比如前面都是零,000000020,超出範圍的數,非法輸入等。
2.注意超出位數。通過位數來判斷當前是否超出int範圍。有三種情況:
* 前9位太大,有第10位;
* 前9位相等但是第10位太大(正負數分別考慮);
* 前10位較小,但是有第11位

int caldigit(int result) {
    int num = 1;
    while (result/10!=0) {
        result = result / 10;
        num++;
    }
    return num;
}

int myAtoi(char* str) {
    char val = str[0
]; // 查詢第一個非空字元的位置 int idx = 0; while (val != '\0') { //過濾空格 if (val != ' ') { break; } idx++; val = str[idx]; } // 偏移 str = str + idx; // 判斷第一個字元是什麼 val = str[0]; int is_positive = 1; int result = 0; // 儲存轉化結果 int num = 0; // 儲存當前位數 int ch_idx = 0; // 字元下標 while (val != '\0') { if (val == '+' && ch_idx == 0) { is_positive = 1; } else if (val == '-' && ch_idx == 0) { is_positive = 0; } // 其他字元,返回0 else if ((val<48 || val>57) && (ch_idx == 0)) { printf("其他字元返回0, %c", val); return 0; } // 不是第一個字元的情況,並且字元不是數字則退出。 else if (val<48 || val>57 && ch_idx != 0) { printf("字元不是數字退出"); break; } // 判斷是否是數字 else if ((val >= 48) && (val <= 57)) { int x = val - '0'; // 計算當前的數字的位數 num = caldigit(result); // 判斷當前的數字是否越界 // [-2147483648,+2147483647] if (num == 9) { // 越界:前9位太大;前9位相等但是第10位太大; if (abs(result) > 214748364 || (abs(result) == 214748364 && x > 7 && is_positive) || (abs(result) == 214748364 && x > 8 && !is_positive) ) { return is_positive ? 2147483648 -1 : -2147483648; } } //前10位沒有超過,但是有第11if (num == 10) { return is_positive ? 2147483648 - 1 : -2147483648; } result = result * 10 + x; } ch_idx++; val = str[ch_idx]; } return is_positive ? result : -result; }