题目描述
解题思路
解题思路:
根据题意,有以下四种字符需要考虑:
- 首部空格: 删除之即可;
- 符号位: 三种情况,即 ‘’+’’ , ‘’−’’ , ‘’无符号” ;新建一个变量保存符号位,返回前判断正负即可;
- 非数字字符: 遇到首个非数字的字符时,应立即返回;
- 数字字符:
- 字符转数字: “此数字的 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;
}
}