实现字符串转换整数的函数 atoi
。
这个函数首先丢弃一些必要的空白字符,直到第一个非空字符的出现。然后,从这个非空字符开始,选择一个可选的初始正负号,后面跟着尽可能多的数字,把它们解读成数字。
字符串中在数字之后可以包含额外的字符,在函数处理过程中应当被忽略并且不会产生影响。
如果字符串中的非空白字符的第一个序列不是有效的整数,或者因为字符串为空或仅包含空白字符而没有这样的序列,则不执行任何转换。
如果无法执行有效的转换,则返回零值。
提示:
1. 只有空格 ' '
才算作空白字符。
2. 假设函数运行的环境只能存储 32 位有符号整数,取值范围为 [-231, 231-1]。如果数字的大小超过了这个可表示的范围,则返回 INT_MAX (231 − 1) 或者 INT_MIN (−231)。
例一:
输入: “42”
输出: 42
例二:
输入: ” -42″
输出: -42
解释: 第一个非空字符是“-”,是负号。然后尽可能多的读取数字,得到 42。
例三:
输入: “4193 with words”
输出: 4193
解释: 在读取数字 3 之后停止转换,因为接下来的字符不是数字。
例四:
输入: “words and 987”
输出: 0
解释: 第一个非空字符是 w,并不是一个数字或者正负号。因此无法进行转换。
例五:
输入: “-91283472332”
输出: -2147483648
解释: -91283472332 超出了 32 位有符号整数可以表示的范围。因此返回 INT_MIN (−231)。
/*
* 8. String to Integer (atoi)
* https://leetcode.com/problems/string-to-integer-atoi/
* https://www.whosneo.com/8-string-to-integer-atoi/
*/
class MyAtoi {
public static void main(String[] args) {
MyAtoi solution = new MyAtoi();
System.out.println(solution.myAtoi("255"));
System.out.println(solution.myAtoi(" -255"));
System.out.println(solution.myAtoi("4193 with words"));
System.out.println(solution.myAtoi("words and 987"));
System.out.println(solution.myAtoi("-91283472332"));
}
private int myAtoi(String str) {
char[] value = str.toCharArray();
int length = str.length();
int sign = 1;
long result = 0;
int i = 0;
while (i < length && value[i] == ' ') { //忽略开头的空格
i++;
}
if (i < length && (value[i] == '-' || value[i] == '+')) { //忽略正负号,且只能出现一次
if (value[i] == '-') sign = -1;
i++;
}
if (i < length && (value[i] < 48 || value[i] > 57)) { //若开头不是数字,直接结束
return 0;
}
while (i < length && value[i] >= 48 && value[i] <= 57) {
result = result * 10 + (value[i] - 48);
i++;
if (result > Integer.MAX_VALUE) { //当数字过大时,没有必要继续计算
if (sign == 1) return Integer.MAX_VALUE;
else return Integer.MIN_VALUE;
}
}
result *= sign;
return (int) result;
}
}