天天看點

字元串轉換整數

字元串轉換整數

描述

請你來實作一個 atoi 函數,使其能将字元串轉換成整數。

首先,該函數會根據需要丢棄無用的開頭空格字元,直到尋找到第一個非空格的字元為止。

當我們尋找到的第一個非空字元為正或者負号時,則将該符号與之後面盡可能多的連續數字組合起來,作為該整數的正負号;假如第一個非空字元是數字,則直接将其與之後連續的數字字元組合起來,形成整數。

該字元串除了有效的整數部分之後也可能會存在多餘的字元,這些字元可以被忽略,它們對于函數不應該造成影響。

注意:假如該字元串中的第一個非空格字元不是一個有效整數字元、字元串為空或字元串僅包含空白字元時,則你的函數不需要進行轉換。

在任何情況下,若函數不能進行有效的轉換時,請傳回 0。

說明:

假設我們的環境隻能存儲 32 位大小的有符号整數,那麼其數值範圍為 [−231, 231 − 1]。如果數值超過這個範圍,請傳回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

輸入: “42”

輸出: 42

示例 2:

輸入: " -42"

輸出: -42

解釋: 第一個非空白字元為 ‘-’, 它是一個負号。

我們盡可能将負号與後面所有連續出現的數字組合起來,最後得到 -42 。

思路和代碼

  1. 去掉前面的空格,直到第一個非空字元出現
  2. 若第一個非空字元是‘+’,則flag=1
  3. 若第一個非空字元是‘-’,則flag=-1
  4. 若不是數字也不是加減号,直接傳回false
  5. 周遊後面連續的數字,并轉換成整數
class Solution {
public:
    int myAtoi(string str) {
        int cur = 0;
        int flag = 1;
        int ret = 0;
        int N = str.length();
        while(cur < N && isspace(str[cur]))
            ++cur;
        if(cur == N)
            return 0;
        else if(cur < N && str[cur] == '-')
            flag = -1;
        else if(cur < N && isdigit(str[cur]))
            ret = str[cur] - '0';
        else if(str[cur] != '+')
            return 0;
        
        while(++cur < N && isdigit(str[cur]))
        {
            int t = (str[cur] - '0') * flag;
            if (ret > INT_MAX / 10 || ret == INT_MAX / 10 && t > 7) return INT_MAX;
            if (ret < INT_MIN / 10 || ret == INT_MIN / 10 && t < -8) return INT_MIN;
            ret = ret * 10 + t;
        }
        return ret;
    }
};