字符串转换整数

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

提示:本题中的空白字符只包括空格字符 ’ ’ 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例:

1
2
输入: "42"
输出: 42
1
2
3
4
输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
1
2
3
输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
1
2
3
4
输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
因此无法执行有效的转换。
1
2
3
4
输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
因此返回 INT_MIN (−231) 。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public solution{
public int myAtoi(String s){
char[] chars=s.toCharArray();
int len=chars.length;
int idx=0;
//去掉前导空格
while(idx<len&&char[idx]==' '){//此处需判断idx是否小于len
idx++;
}
if(idx==len) return 0; //若去掉前导空格到了末尾。
//判断是否为负数
boolean negative=false;
if(char[idx]=='-'){
negative=true;
idx++;
}else if(char[idx]=='+'){
idx++;
}else if(!Character.isDigit(char[idx])){
return 0;
}
int ans=0;
while(idx<len&&Character.isDigit(char[idx])){
int digit=char[idx]-'0';//规律:任何数字字符减去0字符得到该字符对应的数字。ascall码
if(ans>(Integer.MAX_VALUE-digit)/10){
//判断是否越界
//本来应该是 ans * 10 + digit > Integer.MAX_VALUE
// 但是 *10 和 + digit 都有可能越界,所有都移动到右边去就可以了。
return negative? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
ans=ans*10+digit;//后续的digit陆续加入下一位,前一位乘10.
idx++;
}
return negative? -ans:ans;
}
}