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