题目描述

image.png

解题思路

解题思路:
根据题意,有以下四种字符需要考虑:

  • 首部空格: 删除之即可;
  • 符号位: 三种情况,即 ‘’+’’ , ‘’−’’ , ‘’无符号” ;新建一个变量保存符号位,返回前判断正负即可;
  • 非数字字符: 遇到首个非数字的字符时,应立即返回;
  • 数字字符:
  • 字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即可;

数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x ,数字结果为 res ,则数字拼接公式为:
image.png
注意数组越界:
image.png
image.png
判断数组越界的大体解释:边界是 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) 额外空间。

    1. class Solution {
    2. public int strToInt(String str) {
    3. int i = 0;
    4. int length = str.length();
    5. int sign = 1; // 用来标志符号位
    6. int res = 0; // 数字结果
    7. int bndry = Integer.MAX_VALUE / 10; // 数字边界
    8. while (str.charAt(i) == ' ') { // 去掉空格
    9. // 判断是否超过长度
    10. if (++i == length) return 0;
    11. }
    12. // 判断符号位
    13. if (str.charAt(i) == '-') sign = -1; // 此时是负号
    14. if (str.charAt(i) == '+' || str.charAt(i) == '-') i++; // 移动到数字位
    15. for (int j = i; j < length; j++) {
    16. char x = str.charAt(j);
    17. if (x > '9' || x < '0') break; // 不是数字,跳出循环
    18. // 判断数组是否越界
    19. if (res > bndry || (x > '7' && res == bndry))
    20. return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
    21. res = 10 * res + (x - '0'); // 计算数字
    22. }
    23. return sign * res;
    24. }
    25. }