首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >L_00008_MyAtoi:Atoi经典解法

L_00008_MyAtoi:Atoi经典解法

作者头像
mingjie
发布2022-05-12 09:44:39
发布2022-05-12 09:44:39
3800
举报

题目

https://leetcode-cn.com/problems/string-to-integer-atoi/

代码语言:javascript
复制
请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0 。

提示:

本题中的空白字符只包括空格字符 ' ' 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

解法

https://github.com/mjoker73/gap/blob/master/algo-leetcode/src/main/java/L_00008_MyAtoi.java

代码语言:javascript
复制
public class L_00008_MyAtoi {

    public int myAtoi(String s) {
        if (s == null || " ".equals(s)) {
            return 0;
        }
        s = s.trim();

        int result = 0;
        boolean negative = false;
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;

        if (len > 0) {
            char firstChar = s.charAt(0);
            if (firstChar < '0') {
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+') {
                    return 0;
                }

                if (len == 1) {
                    return 0;
                }
                i++;
            }
            multmin = limit / 10;
            while (i < len) {
                digit = Character.digit(s.charAt(i++), 10);
                if (digit < 0) {
                    break;
                }

                if (result < multmin) {
                    return negative? Integer.MIN_VALUE : Integer.MAX_VALUE;
                }
                result *= 10;

                if (result < limit + digit) {
                    return negative? Integer.MIN_VALUE : Integer.MAX_VALUE;
                }
                result -= digit;
            }
        } else {
            return 0;
        }
        return negative ? result : -result;
    }


}

易错点

  1. 正负数做统一的边界处理,全部处理为负数,判断负边界即可
  2. 累加器进位前要判断有没有越界,累加前也要先判断越界
  3. 如果直接使用valueof函数比较尴尬,parseInt函数不管是越界还是非法自负都是抛NumberFormatException,所以直接用parseInt会有问题
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 题目
  • 解法
  • 易错点
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档