【64.字符串转换整数 (atoi)】

120 阅读1分钟

题目

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。

函数 myAtoi(string s) 的算法如下:

  1. 空格: 读入字符串并丢弃无用的前导空格(" "
  2. 符号: 检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。
  3. 转换: 通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
  4. 舍入: 如果整数数超过 32 位有符号整数范围 [−2^31,  2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被舍入为 −2^31 ,大于 2^31 − 1 的整数应该被舍入为 2^31 − 1 。

返回整数作为最终结果。

题解

方式一:模拟

public int myAtoi(String s) {
    int result = 0;
    // 丢弃前导空格
    s = s.trim();
    // 检查符号
    boolean positive = true;
    if (s.startsWith("-")) {
        positive = false;
        s = s.substring(1);
    } else if (s.startsWith("+")) {
        positive = true;
        s = s.substring(1);
    }
    // 转换
    // 越界问题还可以比较 Integer.MAX_VALUE/10和Integer.MAX_VALUE%10
    StringBuilder sb = new StringBuilder();
    boolean startZero = true;
    for (char c: s.toCharArray()) {
        if (!Character.isDigit(c)) {
            break;
        }
        if (startZero && c == '0') {
            continue;
        }
        startZero = false;
        sb.append(c);
        if (sb.length() > 0 && positive && Long.parseLong(sb.toString()) >= Integer.MAX_VALUE) {
            return Integer.MAX_VALUE;
        }
        if (sb.length() > 0 && !positive && -Long.parseLong(sb.toString()) <= Integer.MIN_VALUE) {
            return Integer.MIN_VALUE;
        }
    }
    if (sb.length() > 0) {
        if (positive) {
            result += Integer.parseInt(sb.toString());
        } else {
            result -= Integer.parseInt(sb.toString());
        }
    }
    return result;
}

总结

算法:模拟