diff --git a/notes/67. 把字符串转换成整数.md b/notes/67. 把字符串转换成整数.md index db736fa8..74e862d2 100644 --- a/notes/67. 把字符串转换成整数.md +++ b/notes/67. 把字符串转换成整数.md @@ -22,20 +22,53 @@ Output: ```java public int StrToInt(String str) { - if (str == null || str.length() == 0) - return 0; - boolean isNegative = str.charAt(0) == '-'; - int ret = 0; - for (int i = 0; i < str.length(); i++) { - char c = str.charAt(i); - if (i == 0 && (c == '+' || c == '-')) /* 符号判定 */ - continue; - if (c < '0' || c > '9') /* 非法输入 */ + if (str == null) return 0; - ret = ret * 10 + (c - '0'); + int result = 0; + boolean negative = false;//是否负数 + int i = 0, len = str.length(); + /** + * limit 默认初始化为*负的*最大正整数 ,假如字符串表示的是正数 + * 由于int的范围为-2147483648~2147483647 + * 那么result(在返回之前一直是负数形式)就必须和这个最大正数的负数来比较来判断是否溢出, + */ + int limit = - Integer.MAX_VALUE; + int multmin; + int digit; + + if (len > 0) { + char firstChar = str.charAt(0);//首先看第一位 + if (firstChar < '0') { // 有可能是 "+" or "-" + if (firstChar == '-') { + negative = true; + limit = Integer.MIN_VALUE;//在负号的情况下,判断溢出的值就变成了 整数的 最小负数了 + } else if (firstChar != '+')//第一位不是数字和-只能是+ + return 0; + if (len == 1) // Cannot have lone "+" or "-" + return 0; + i++; + } + multmin = limit / 10; + while (i < len) { + digit = str.charAt(i++)-'0'; + if (digit < 0 || digit > 9) + return 0; + //判断溢出 + if (result < multmin) { + return 0; + } + result *= 10; + if (result < limit + digit) { + return 0; + } + result -= digit; + } + } else { + return 0; + } + //如果是正数就返回-result(result一直是负数) + return negative ? result : -result; } - return isNegative ? -ret : ret; -} ```