NC100 把字符串转换成整数(atoi)

  算法   6分钟   377浏览   0评论

题目链接:https://www.nowcoder.com/practice/d11471c3bf2d40f38b66bb12785df47f

题目描述

写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:

  1. 若干空格

  2. (可选)一个符号字符('+' 或 '-')

  3. 数字,字母,符号,空格组成的字符串表达式

  4. 若干空格

转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
3.3 整数超过 32 位有符号整数范围[−2^31, 2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31的整数应该被调整为 −2^31,大于 2^31 − 1 的整数应该被调整为 2^31 − 1

4.去掉无用的后导空格

数据范围:

0 <=字符串长度<= 100

字符串由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成

示例 1:

输入:"82"
返回值:82

示例 2:

输入:"   -12  "
返回值:-12
说明:去掉前后的空格,为-12

示例 3:

输入:"4396 clearlove"
返回值:4396
说明:6后面的字符不属于有效的整数部分,去除,但是返回前面提取的有效部分

示例 4:

输入:"clearlove 4396"
返回值:0

示例 5:

输入:"-987654321111"
返回值:-2147483648

解题代码

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    public int StrToInt (String s) {
        // write code here
        //判断是否无效
        if (s == null)
            return 0;
        //切割首尾空格
        s = s.trim();
        if (s.equals(""))
            return 0;
        char first = s.charAt(0);
        int res = 0;
        //判断头部是否有效
        if (!(first == '-' || first == '+' || (first >= '0' && first <= '9')))
            return 0;
        //记录数字开始的有效位置
        int start = 0;
        //用于判断是否超出32位有效整数
        int minq = Integer.MIN_VALUE / 10;
        int minr = Integer.MIN_VALUE % 10;
        //判断结果正负
        boolean pos = first == '-' ? false : true;
        if (first == '-' || first == '+')
            start++;
        //一律用负数表示结果,最后再定正负
        for (int i = start; i < s.length(); i++) {
            char cur = s.charAt(i);
            //若当前字符无效,立刻停止
            if (cur < '0' || cur > '9')
                break;
            //计算当前字符表示的数字
            int val = 0 - Integer.parseInt(Character.toString(cur));
            //如果超出了最小负整数
            if (res < minq || (res == minq && val < minr))
                return pos ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            res = res * 10 + val;
        }
        //根据正负号,返回对应的值
        return pos ? res == Integer.MIN_VALUE ? Integer.MAX_VALUE : -res : res;
    }
}

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧☕
微信
支付宝
  0 条评论