题目描述
解题思路
解题思路:
根据题意,有以下四种字符需要考虑:
- 首部空格: 删除之即可;
 - 符号位: 三种情况,即 ‘’+’’ , ‘’−’’ , ‘’无符号” ;新建一个变量保存符号位,返回前判断正负即可;
 - 非数字字符: 遇到首个非数字的字符时,应立即返回;
 - 数字字符:
 - 字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即可;
 
数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x ,数字结果为 res ,则数字拼接公式为:
注意数组越界:

判断数组越界的大体解释:边界是 Integer.MAX_VALUE / 10 比较的原因是如果还没加x就已经大于边界,也就是214748365,那么就已经越界,因为后面要乘10,如果加上x时判断,因为Integer.MAX_VALUE的最后一位是7,那么除10之后,个位加上的x就需要和7做判断,res就需要和边界相等,才满足后面的res = 10 * res + (x - ‘0’); 的公式。
复杂度分析:
- 时间复杂度 O(N) : 其中 NN 为字符串长度,线性遍历字符串占用 O(N) 时间。
 空间复杂度 O(N) : 删除首尾空格后需建立新字符串,最差情况下占用 O(N) 额外空间。
class Solution {public int strToInt(String str) {int i = 0;int length = str.length();int sign = 1; // 用来标志符号位int res = 0; // 数字结果int bndry = Integer.MAX_VALUE / 10; // 数字边界while (str.charAt(i) == ' ') { // 去掉空格// 判断是否超过长度if (++i == length) return 0;}// 判断符号位if (str.charAt(i) == '-') sign = -1; // 此时是负号if (str.charAt(i) == '+' || str.charAt(i) == '-') i++; // 移动到数字位for (int j = i; j < length; j++) {char x = str.charAt(j);if (x > '9' || x < '0') break; // 不是数字,跳出循环// 判断数组是否越界if (res > bndry || (x > '7' && res == bndry))return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;res = 10 * res + (x - '0'); // 计算数字}return sign * res;}}
