請你來實(shí)現(xiàn)一個 myAtoi(string s) 函數(shù),使其能將字符串轉(zhuǎn)換成一個 32 位有符號整數(shù)(類似 C/C++ 中的 atoi 函數(shù))。
函數(shù) myAtoi(string s) 的算法如下:
讀入字符串并丟棄無用的前導(dǎo)空格
檢查下一個字符(假設(shè)還未到字符末尾)為正還是負(fù)號,讀取該字符(如果有)。 確定最終結(jié)果是負(fù)數(shù)還是正數(shù)。 如果兩者都不存在,則假定結(jié)果為正。
讀入下一個字符,直到到達(dá)下一個非數(shù)字字符或到達(dá)輸入的結(jié)尾。字符串的其余部分將被忽略。
將前面步驟讀入的這些數(shù)字轉(zhuǎn)換為整數(shù)(即,"123" -> 123, "0032" -> 32)。如果沒有讀入數(shù)字,則整數(shù)為 0 。必要時(shí)更改符號(從步驟 2 開始)。
如果整數(shù)數(shù)超過 32 位有符號整數(shù)范圍 [?231, 231 ? 1] ,需要截?cái)噙@個整數(shù),使其保持在這個范圍內(nèi)。具體來說,小于 ?231 的整數(shù)應(yīng)該被固定為 ?231 ,大于 231 ? 1 的整數(shù)應(yīng)該被固定為 231 ? 1 。
返回整數(shù)作為最終結(jié)果。
注意:
本題中的空白字符只包括空格字符 ' ' 。
除前導(dǎo)空格或數(shù)字后的其余字符串外,請勿忽略 任何其他字符。
示例 1:
輸入:s = "42"
輸出:42
解釋:加粗的字符串為已經(jīng)讀入的字符,插入符號是當(dāng)前讀取的字符。
第 1 步:"42"(當(dāng)前沒有讀入字符,因?yàn)闆]有前導(dǎo)空格)
第 2 步:"42"(當(dāng)前沒有讀入字符,因?yàn)檫@里不存在 '-' 或者 '+')
第 3 步:"42"(讀入 "42")
解析得到整數(shù) 42 。
由于 "42" 在范圍 [-231, 231 - 1] 內(nèi),最終結(jié)果為 42 。
示例 2:
輸入:s = " -42"
輸出:-42
解釋:
第 1 步:" -42"(讀入前導(dǎo)空格,但忽視掉)
第 2 步:" -42"(讀入 '-' 字符,所以結(jié)果應(yīng)該是負(fù)數(shù))
第 3 步:" -42"(讀入 "42")
解析得到整數(shù) -42 。
由于 "-42" 在范圍 [-231, 231 - 1] 內(nèi),最終結(jié)果為 -42 。
示例 3:
輸入:s = "4193 with words"
輸出:4193
解釋:
第 1 步:"4193 with words"(當(dāng)前沒有讀入字符,因?yàn)闆]有前導(dǎo)空格)
第 2 步:"4193 with words"(當(dāng)前沒有讀入字符,因?yàn)檫@里不存在 '-' 或者 '+')
第 3 步:"4193 with words"(讀入 "4193";由于下一個字符不是一個數(shù)字,所以讀入停止)
解析得到整數(shù) 4193 。
由于 "4193" 在范圍 [-231, 231 - 1] 內(nèi),最終結(jié)果為 4193 。
示例代碼
+ (int)hy_myAtoi:(NSString *)s {
if (!s || s.length == 0) {
return 0;
}
NSInteger i = 0;
NSInteger sign = 1;
NSInteger result = 0;
// 移除前導(dǎo)空格
while (i < s.length && [s characterAtIndex:i] == ' ') {
i++;
}
// 處理正負(fù)號
if (i < s.length && ([s characterAtIndex:i] == '+' || [s characterAtIndex:i] == '-')) {
sign = [s characterAtIndex:i] == '-' ? -1 : 1;
i++;
}
// 處理數(shù)字字符
while (i < s.length && [s characterAtIndex:i] >= '0' && [s characterAtIndex:i] <= '9') {
int digit = [s characterAtIndex:i] - '0';
if (result > INT_MAX / 10 || (result == INT_MAX / 10 && digit > INT_MAX % 10)) {
return sign == -1 ? INT_MIN : INT_MAX;
}
result = result * 10 + digit;
i++;
}
return (int)(sign * result);
}
該算法首先移除前導(dǎo)空格,并處理正負(fù)號。然后它逐個字符地讀取數(shù)字字符,并將其轉(zhuǎn)換為整數(shù)。如果整數(shù)超出了 32 位有符號整數(shù)范圍,則會截?cái)嘣撜麛?shù)以使其保持在此范圍內(nèi)。
要使用該函數(shù),請調(diào)用 myAtoi 方法,并將要轉(zhuǎn)換的字符串作為參數(shù)傳遞給它。