LeetCode 8 字符串转换整数(atoi) 字符串模拟 Java实现

  • Post author:
  • Post category:java


在这里插入图片描述

在这里插入图片描述

这个题目没有考察算法知识,模拟的是日常开发中对原始数据的处理,

面试遇到这类问题,应先仔细阅读题目文字说明和示例,有疑惑的地方需要和面试官确认,在编码的时候需要耐心和细心调试


几个要点:

  • 去掉先导空格
  • 判断第一个字符为+或者-的情况,因此,需要设计一个遍历sign,初始化时为1,如果遇到 -(负号),将sign的值修改为-1
  • 判断是否是数字,可以使用字符的ASCII码数值进行比较,即c >= ‘0’ && c <= ‘9’
  • 在遇到第一个字符不是数字字符的情况下,转换停止,退出循环
  • 如果转换以后的数字超过了int类型的范围,需要截取。这里不能将记录结果的变量res设置为long型,注意:由于输入的字符串转换以后也可能超过long类型,因此需要在循环内部就判断是否越界,只要越界就退出循环,这样也可以减少不必要的计算
  • 下标访问,因此,全程需要考虑数组下标是否越界的情况

    • 由于题目中说【环境只能保存32位整数】,因此,这里在每一轮循环之前先要检查乘以10以后是否溢出
class Solution {
    public int myAtoi(String s) {

        int len = s.length();

        char[] charArray = s.toCharArray();

        //1. 去除前导空格
        int index = 0;
        while (index < len && charArray[index] == ' ') {
            index++;
        }

        //针对极端情况 "            "
        if (index == len) {
            return 0;
        }

        //如果出现符号字符,仅第一个有效,并记录正负
        //sign=1表示默认为正数
        int sign = 1;
        char firstChar = charArray[index];
        if (firstChar == '+') {
            index++;
        } else if (firstChar == '-') {
            index++;
            sign = -1;
        }

        //将后续出现的数字字符进行转换
        //不能使用long类型,题目说的?
        int res = 0;
        while (index < len) {
            char currChar = charArray[index];

            //先判断不合法的情况
            if (currChar < '0' || currChar > '9') {
                break;
            }

            //题目中说:环境只能存储32位大小的有符号正数,因此,需要提前判断:乘以10以后是否越界
            if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (currChar - '0') > Integer.MAX_VALUE % 10)) {
                return Integer.MAX_VALUE;
            }
            if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (currChar - '0') > -(Integer.MIN_VALUE % 10))) {
                return Integer.MIN_VALUE;
            }

            //合法的情况下,才考虑转换,每一步都把符号位乘进去
            res = res * 10 + sign * (currChar - '0');
            index++;
        }

        return res;
    }
}

算法的时间复杂度:O(N),这里N为字符串的长度



版权声明:本文为guliguliguliguli原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。