字符串转整数 (atoi)

实现 atoi,将字符串转为整数。
该函数首先根据需要丢弃任意多的空格字符,直到找到第一个非空格字符为止。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
说明:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

public int myAtoi(String str) {
    //先去除头尾空字符串
    str = str.trim();
    //如果含有空格还需要去掉
    if (str .contains(" ")) {
        String[] strs1 = str.split(" ");
        str = strs1[0];
    }
    //如果有小数点,需要去掉小数点后面的;
    if (str.contains(".")) {
        String[] strs2 = str.split("\\.");
        str = strs2[0];
    }
    //正则判断是否为纯数字字符串
    String regex = "^[-\\+]?[\\d]+$";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(str);
    if (!matcher.matches())
        return 0;
    if (Long.parseLong(str) > Integer.MAX_VALUE)
        return Integer.MAX_VALUE;
    if (Long.parseLong(str) < Integer.MIN_VALUE)
        return Integer.MIN_VALUE;
    //然后转为数字
    int res = Integer.parseInt(str);
    return res;
}

注意:具体思路操作代码上有注解,此方法不能再leekcode上面执行,因为不能识别Pattern类。
后面测试
输入: " -0012a42" 输出:0 预期:-12
还有这个要求,用Java这些基础类功能会比较繁琐,需要改进;
思路:可以先把第一个不含空格的字符串拿出来,挨个遍历其中每个字符,首个为“+,-”或者数字都可,一直到出现非数字字符,把这些结果依次保存最后输出即可;

public int myAtoi(String str) {
        //先去除头尾空字符串
        str = str.trim();
        //如果含有空格还需要去掉
        if (str .contains(" ")) {
            str = str.split(" ")[0];
        }
        //如果有小数点,需要去掉小数点后面的;
        if (str.contains(".")) {
            str = str.split("\\.")[0];
        }
        String regex = "^[-\\+]?[\\d]*$";
        Pattern pattern = Pattern.compile(regex);
        Pattern pattern1 = Pattern.compile("^[\\d]$");
        Matcher matcher = pattern.matcher(str);
        //截取正确的数字段
        StringBuffer buffer = new StringBuffer();
        char[] chs = str.toCharArray();
        if (pattern.matcher(String.valueOf(chs[0])).matches())
            buffer.append(chs[0]);
        for (int i = 1; i < chs.length;i ++) {
            if (pattern1.matcher(String.valueOf(chs[i])).matches()) {
                buffer.append(chs[i]);
            } else {
                break;
            }
        }
        str = buffer.toString();
        if (str.length() == 0 || (str.length() == 1 && (str.contains("-") || str.contains("+"))))
            return 0;
        if (Long.parseLong(str) > Integer.MAX_VALUE)
            return Integer.MAX_VALUE;
        if (Long.parseLong(str) < Integer.MIN_VALUE)
            return Integer.MIN_VALUE;
        //然后转为数字
        int res = Integer.parseInt(str);
        return res;
    }

改进后的代码,可以进行上述那种字符串的检测,但是代码整体有点臃肿,对JDK的API依赖很大,要想通过LeekCode测试,可以把每个字符的判断自己写个方法,就是一个注意筛选,然后求得纯数字字符串,然后转化罢了!求大佬有没有精简的算法?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值