字符串转换整数

442 阅读2分钟

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

**1.leetcode 字符串转换整数 (atoi)

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

注意:

  • 本题中的空白字符只包括空格字符 ' ' 。
  • 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

示例 1:

输入:s = "42"
输出:42

示例 2:

输入: s = "   -42"
输出: -42

示例 3:

输入: s = "4193 with words"
输出: 4193

按题目要求将一个字符串转为32位有符号整数,整数那么就不用管小数点了,字符串可以为英文、数字、一些符号组成(空格、正负号),并且只需要获取最近的一个数字字符。按题目思路来,首先字符串可能会有不定数量的前导空格,这些是无用的,我们需要忽略掉,然后读取下一个非空格字符,这个字符可能是正负号,如果是的话需要记录下来,以便确定最终结果的符号,然后在读取下一个字符如果没有则默认为正,从这开始一直读取字符,直到遇到非数字字符终止,同时获取的数字用一个长整形保存,这样可以判断如果目前读取到的数字超过32位有符号的整形就是溢出了,就需要直接返回其范围的最大值,但是这里获取的数字是无符号的,所以需要根据前面记录的符号判断返回其对应的最大值。否则最后将长整形转为32为数返回。

class Solution {
    public int myAtoi(String s) {
        long res = 0L;

        // 是否为负数
        boolean negativeNumber = false;
        int len = s.length();
        // 临时索引,记录第一个非空格或者正负号的索引下标
        int indexTemp = 0;
        char ascii;
        for (int i = 0; i < len; i++) {
            ascii = s.charAt(i);
            // 丢弃无用的前导空格
            if (ascii == ' ') {
                continue;
            }
            // 读取到下一个非空格字符
            indexTemp = i;
            // 如果有正负号
            if (ascii == '+' || ascii == '-') {
                // 再往下一个
                indexTemp++;
                // 记录正负数
                negativeNumber = ascii == '-';
            }
            break;
        }
        // 从这里开始获取数字
        for (int i = indexTemp; i < len; i++) {
            ascii = s.charAt(i);
            // 不是数字,就直接结束
            if (ascii < '0' || '9' < ascii) {
                break;
            }
            // 依次获取数字,这个数字是无符号的
            res = res * 10 + (ascii - '0');
            // 判断如果溢出32有符号整数,就返回其最大值
            if (res > Integer.MAX_VALUE) {
                return negativeNumber ? Integer.MIN_VALUE : Integer.MAX_VALUE;
            }
        }
        // 最后根据情况是否加上符号
        if (negativeNumber) {
            res *= -1;
        }
        return (int) res;
    }
}