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這個到底是個神馬函數(shù)弃甥,輸入輸出的結(jié)果是啥色乾。
查了查資料,發(fā)現(xiàn)是這樣的規(guī)律:
- 返回類型為int類型主巍,若字符串越界笋敞,則返回Integer.MAX_VALUE或Integer.MIN_VALUE.
- 開頭是+返回正數(shù)碱蒙;-返回負數(shù)。例如“+23”返回23夯巷;“-42”返回-42赛惩。
- 開頭不是數(shù)字,則返回0:“fw923”和“+se243”都返回0趁餐。
- 若開頭為空格喷兼,則無視空格:“ 233”返回233。
- 只取連續(xù)的數(shù)字:“233pp233”返回的是233而不是233233后雷。
貌似暫時就這么多季惯。
所以應對這些規(guī)律的解題思路:
- 首先判斷字符串是否為空或長度為0
- 用trim()去掉字符串首尾的空格
- 判斷符號
- 判斷是否越界
注意點:
- 返回值sum定義為long,最后return的時候再強制轉(zhuǎn)換為int
- 判斷越界要在for循環(huán)里
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))) // 判斷是否為數(shù)字
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的數(shù)字字符獲取數(shù)字字符char的值
int value = c - '0';
int的邊界
Integer.MAX_VALUE & Integer.MIN_VALUE
TO DO
暫無