題目:
在找到第一個非空字符之前刚梭,需要移除掉字符串中的空格字符今阳。如果第一個非空字符是正號或負號,選取該符號逊躁,并將其與后面盡可能多的連續(xù)的數(shù)字組合起來似踱,這部分字符即為整數(shù)的值。如果第一個非空字符是數(shù)字稽煤,則直接將其與之后連續(xù)的數(shù)字字符組合起來核芽,形成整數(shù)。
字符串可以在形成整數(shù)的字符后面包括多余的字符酵熙,這些字符可以被忽略轧简,它們對于函數(shù)沒有影響。
當字符串中的第一個非空字符序列不是個有效的整數(shù)匾二;或字符串為空哮独;或字符串僅包含空白字符時拳芙,則不進行轉(zhuǎn)換。
若函數(shù)不能執(zhí)行有效的轉(zhuǎn)換皮璧,返回 0舟扎。
說明:
假設(shè)我們的環(huán)境只能存儲 32 位有符號整數(shù),其數(shù)值范圍是 [?231, 231 ? 1]悴务。如果數(shù)值超過可表示的范圍睹限,則返回 INT_MAX (231 ? 1) 或 INT_MIN (?231) 。
示例 1:
輸入: "42"
輸出: 42
示例 2:
輸入: " -42"
輸出: -42
解釋: 第一個非空白字符為 '-', 它是一個負號讯檐。
我們盡可能將負號與后面所有連續(xù)出現(xiàn)的數(shù)字組合起來邦泄,最后得到 -42 。
示例 3:
輸入: "4193 with words"
輸出: 4193
解釋: 轉(zhuǎn)換截止于數(shù)字 '3' 裂垦,因為它的下一個字符不為數(shù)字。
示例 4:
輸入: "words and 987"
輸出: 0
解釋: 第一個非空字符是 'w', 但它不是數(shù)字或正肌索、負號蕉拢。
因此無法執(zhí)行有效的轉(zhuǎn)換。
示例 5:
輸入: "-91283472332"
輸出: -2147483648
解釋: 數(shù)字 "-91283472332" 超過 32 位有符號整數(shù)范圍诚亚。
因此返回 INT_MIN (?231) 晕换。
分析:
- 1,本題常見的用法是遍歷站宗,時間復雜度為O(n)闸准。
class Solution {
public:
int myAtoi(string str) {
if (str.empty()) return 0;
int sign = 1, base = 0, i = 0, n = str.size();
while (i < n && str[i] == ' ') ++i;
if (str[i] == '+' || str[i] == '-') {
sign = (str[i++] == '+') ? 1 : -1;
}
while (i < n && str[i] >= '0' && str[i] <= '9') {
if (base > INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
return (sign == 1) ? INT_MAX : INT_MIN;
}
base = 10 * base + (str[i++] - '0');
}
return base * sign;
}
};
上面代碼在LeetCode上的運行時間為24 ms。