其他分享
首页 > 其他分享> > LeetCode 0008 String to Integer (atoi)

LeetCode 0008 String to Integer (atoi)

作者:互联网

原题传送门

1. 题目描述

2. Solution 1

1、思路分析
自动状态机
a.) 输入字符所有可能情况分类: space(空格), +/-, number, other
b.) 根据当前状态(字符),与下一个字符可以得出下一状态: 即 下一状态 = f(当前状态, 下一字符)
下一字符
space +/- number other
当前状态 start start signed in_number end
signed end end in_number end
in_number end end in_number end
end end end end end
2、代码实现

package Q0099.Q0008StringtoInteger;

/*
    自动机
    1. 输入字符所有可能情况分类: space(空格), +/-, number, other
    2. 根据当前状态(字符),与下一个字符可以得出下一状态: 即 下一状态 = f(当前状态, 下一字符)
                            下一字符
                            space           +/-         number      other
        当前状态 start       start          signed       in_number   end
                signed      end             end         in_number   end
                in_number   end             end         in_number   end
                end         end             end         end         end
     System.out.println(Integer.MAX_VALUE);  // 2147483647
     System.out.println(Integer.MIN_VALUE);  // -2147483648   -2147483647
 */
public class Solution1 {
    /*
      不使用long,手动判断溢出
     */
    public int myAtoi(String str) {
        str = str.trim();
        if (str.length() == 0) return 0;
        if (!Character.isDigit(str.charAt(0)) && str.charAt(0) != '-' && str.charAt(0) != '+') return 0;
        int res = 0;
        boolean neg = str.charAt(0) == '-';
        int curNumberIndex = !Character.isDigit(str.charAt(0)) ? 1 : 0;
        while (curNumberIndex < str.length() && Character.isDigit(str.charAt(curNumberIndex))) {
            // int型的边界扣除当前数,即当前res的边界
            int tmp = ((neg ? Integer.MIN_VALUE : Integer.MIN_VALUE + 1) + (str.charAt(curNumberIndex) - '0')) / 10;
            if (tmp > res) { // 因为tmp, res均为负,tmp > res <=> abs(tmp) < abs(res),即当前res已越界
                return neg ? Integer.MIN_VALUE : Integer.MAX_VALUE;
            }
            res = res * 10 - (str.charAt(curNumberIndex++) - '0'); // res  恒为负    1 3 8 -> -12
        }
        return neg ? (int) res : (int) -res;
    }
}

time complexity: O(n)
space complexity: O(1)

3. Solution 2:

1、思路分析
逐位处理字符串,把字符串类型的数字按ASCII转换成int型并累加到结果。
注意符号的处理及溢出。
2、代码实现

package Q0099.Q0008StringtoInteger;

public class Solution2 {
    /*
      1. discards all leading whitespaces
      2. sign of the number
      3. overflow
      4. invalid input
    */
    public int myAtoi(String str) {
        int sign = 1, base = 0, i = 0;
        while (i < str.length() && str.charAt(i) == ' ') i++;
        if (i == str.length()) return 0;
        if (str.charAt(i) == '-' || str.charAt(i) == '+') {
            sign = str.charAt(i++) == '-' ? -1 : 1;
        }
        while (i < str.length() && str.charAt(i) >= '0' && str.charAt(i) <= '9') {
            if (base > Integer.MAX_VALUE / 10 ||
                    (base == Integer.MAX_VALUE / 10 && str.charAt(i) - '0' > 7))
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            base = 10 * base + (str.charAt(i++) - '0');
        }
        return base * sign;
    }
}

time complexity: O(n)
space complexity: O(1)

标签:end,charAt,res,0008,number,atoi,str,Integer
来源: https://www.cnblogs.com/junstat/p/15934376.html