字元串轉換整數
描述
請你來實作一個 atoi 函數,使其能将字元串轉換成整數。
首先,該函數會根據需要丢棄無用的開頭空格字元,直到尋找到第一個非空格的字元為止。
當我們尋找到的第一個非空字元為正或者負号時,則将該符号與之後面盡可能多的連續數字組合起來,作為該整數的正負号;假如第一個非空字元是數字,則直接将其與之後連續的數字字元組合起來,形成整數。
該字元串除了有效的整數部分之後也可能會存在多餘的字元,這些字元可以被忽略,它們對于函數不應該造成影響。
注意:假如該字元串中的第一個非空格字元不是一個有效整數字元、字元串為空或字元串僅包含空白字元時,則你的函數不需要進行轉換。
在任何情況下,若函數不能進行有效的轉換時,請傳回 0。
說明:
假設我們的環境隻能存儲 32 位大小的有符号整數,那麼其數值範圍為 [−231, 231 − 1]。如果數值超過這個範圍,請傳回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例 1:
輸入: “42”
輸出: 42
示例 2:
輸入: " -42"
輸出: -42
解釋: 第一個非空白字元為 ‘-’, 它是一個負号。
我們盡可能将負号與後面所有連續出現的數字組合起來,最後得到 -42 。
思路和代碼
- 去掉前面的空格,直到第一個非空字元出現
- 若第一個非空字元是‘+’,則flag=1
- 若第一個非空字元是‘-’,則flag=-1
- 若不是數字也不是加減号,直接傳回false
- 周遊後面連續的數字,并轉換成整數
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;
}
};