LeetCode:字串轉換整數 (atoi)
利用不同字符的 ASCII 編碼判斷種類,提取字串中的數字,再判斷數字是否超出范圍
No.8 字串轉換整數 (atoi)
題目:
請你來實作一個 atoi 函式,使其能將字串轉換成整數,
首先,該函式會根據需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符為止,
當我們尋找到的第一個非空字符為正或者負號時,則將該符號與之后面盡可能多的連續數字組合起來,作為該整數的正負號;假如第一個非空字符是數字,則直接將其與之后連續的數字字符組合起來,形成整數,
該字串除了有效的整數部分之后也可能會存在多余的字符,這些字符可以被忽略,它們對于函式不應該造成影響,
注意:假如該字串中的第一個非空格字符不是一個有效整數字符、字串為慷訓字串僅包含空白字符時,則你的函式不需要進行轉換,
在任何情況下,若函式不能進行有效的轉換時,請回傳 0
假設我們的環境只能存盤 32 位大小的有符號整數,那么其數值范圍為 [?231, 231 ? 1],如果數值超過這個范圍,請回傳 INT_MAX (231 ? 1) 或 INT_MIN (?231)
示例 1:
輸入: "42"
輸出: 42
示例 2:
輸入: " -42"
輸出: -42
解釋: 第一個非空白字符為 '-', 它是一個負號
我們盡可能將負號與后面所有連續出現的數字組合起來,最后得到 -42
示例 3:
輸入: "4193 with words"
輸出: 4193
解釋: 轉換截止于數字 '3' ,因為它的下一個字符不為數字
示例 4:
輸入: "words and 987"
輸出: 0
解釋: 第一個非空字符是 'w', 但它不是數字或正、負號
因此無法執行有效的轉換
示例 5:
輸入: "-91283472332"
輸出: -2147483648
解釋: 數字 "-91283472332" 超過 32 位有符號整數范圍
因此回傳 INT_MIN ($?2^{31}$)
解法:
-
數學方法
遍歷每個字符,判斷字符型別
class Solution { public int myAtoi(String str) { int start = 0; while (str.length() > start && str.charAt(start) == ' ') start++; if (str.length() == start) return 0; int ans = 0; int flag = 1; char[] chars = str.toCharArray(); for (int i = start; i < chars.length; i++) { if (i == start) { if (getSymbol(chars[i]) == 0) return 0; if (getSymbol(chars[i]) == 1) continue; if (getSymbol(chars[i]) == -1) { flag = -1; continue; } } if (getSymbol(chars[i]) == 2) { if (flag == 1) { if (ans > Integer.MAX_VALUE / 10 || (ans == Integer.MAX_VALUE / 10 && chars[i] - 48 > Integer.MAX_VALUE % 10)) return Integer.MAX_VALUE; ans = ans * 10 + chars[i] - 48; } else { if (ans < Integer.MIN_VALUE / 10 || (ans == Integer.MIN_VALUE / 10 && -(chars[i] - 48) < Integer.MIN_VALUE % 10)) return Integer.MIN_VALUE; ans = ans * 10 - (chars[i] - 48); } } else break; } return ans; } public int getSymbol(char c) { if (c == '+') return 1; else if (c == '-') return -1; else if ((int) c >= (int) '0' && (int) c <= (int) '9') return 2; else return 0; } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/73552.html
標籤:其他
下一篇:樹狀陣列的基本操作
