Question
Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
这题的难点应该是atoi这个到底是个神马函数,输入输出的结果是啥。
查了查资料,发现是这样的规律:
- 返回类型为int类型,若字符串越界,则返回Integer.MAX_VALUE或Integer.MIN_VALUE.
- 开头是+返回正数;-返回负数。例如“+23”返回23;“-42”返回-42。
- 开头不是数字,则返回0:“fw923”和“+se243”都返回0。
- 若开头为空格,则无视空格:“ 233”返回233。
- 只取连续的数字:“233pp233”返回的是233而不是233233。
貌似暂时就这么多。
所以应对这些规律的解题思路:
- 首先判断字符串是否为空或长度为0
- 用trim()去掉字符串首尾的空格
- 判断符号
- 判断是否越界
注意点:
- 返回值sum定义为long,最后return的时候再强制转换为int
- 判断越界要在for循环里
Solutions
public class Solution {
public int myAtoi(String str) {
// 判断是否为空和长度是否为0
if(str == null || str.length() == 0)
return 0;
// 去掉字符串首尾的空格
str = str.trim();
int sign = 1, start = 0, len = str.length();
long sum = 0;
// 判断符号
char firstChar = str.charAt(0);
if (firstChar == '+') {
sign = 1;
start++;
} else if (firstChar == '-') {
sign = -1;
start++;
}
for (int i = start; i < len; i++) {
if (!Character.isDigit(str.charAt(i))) // 判断是否为数字
return (int) sum * sign;
sum = sum * 10 + str.charAt(i) - '0';
// 判断是否越界
if (sign == 1 && sum > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
if (sign == -1 && (-1) * sum < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
}
return (int) sum * sign;
}
}
Points
String.trim()
去掉字符串首尾的空格,保留中间的String.charAt()
返回指定索引处的char值Character.isDigit(char c)
判断字符c是否为0-9的数字字符获取数字字符char的值
int value = c - '0';
int的边界
Integer.MAX_VALUE & Integer.MIN_VALUE
TO DO
暂无