iOS與算法之《字符串轉(zhuǎn)換整數(shù) (atoi)》

請你來實(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ù)傳遞給它。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容