leetCode-8:String to Integer (atoi)

给定一个字符串,将其转换成整数。转换规则如下:

  • 整数第一个字符必须是 -+0-9 的数字
  • 整数前面允许有空格,但是不允许有其他的字符出现,如果出现其他字符,表明这个字符串无法转成整数,返回数字 0
  • 在由一连串数字构成的整数后面,如果出现其他字符,则不用继续转换,只取第一个转换的整数返回即可
  • 如果在转换的过程中,整数的范围超过 Integer.MIN_VALUE ~ Integer.MAX_VALUE ,则负数返回 Integer_MIN_VALUE,正数返回 Integer_MAX_VALUE

样例输入输出

输入:” -42abc”

输出:-42

输入:”-123456789012345”

输出:-2147483648

输入:”abc 1123”

输出:0

问题解法

使用正则

使用正则表达式先将数字查找出来,然后使用 Integer.parseInt 函数将字符串转成数字,在转换的过程中,如果超过范围,则会抛出NumberFormatException,因此,只需要捕获 NumberFormatException 异常,并在异常处理中判断是返回最小值还是最大值即可。

此种方法相对而言比较简单,看起来也很清晰,不过在将字符串转成整形的过程中,使用了异常代码块进行正常业务逻辑的处理,这不太好。

代码如下

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class
{
public int myAtoi(String str)
{
if (str == null || str.length() == 0)
{
return 0;
}

String nums = str.trim();
int length = nums.length();
if (length < 1)
{
return 0;
}

Pattern pattern = Pattern.compile("[-+]{0,1}\d+");
Matcher matcher = pattern.matcher(nums);
if (!matcher.find())
{
return 0;
}

String num = matcher.group();
int startIndex = matcher.start();
if (startIndex != 0)
{
return 0;
}

int result = 0;
try
{
result = Integer.parseInt(num);
}
catch (NumberFormatException e)
{
if (num.charAt(0) == '-')
{
result = Integer.MIN_VALUE;
}
else
{
result = Integer.MAX_VALUE;
}
}

return result;
}
}

遍历字符串

使用正则虽然简单明了,但是却比较耗时,因此可以直接使用最原始的方法:遍历字符串。在遍历字符串的过程中同时将其转成整形。此种方法相对而言比较繁琐一点,但是耗时更少。代码如下

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
class Solution 
{
public int myAtoi(String str)
{
if (str == null || str.length() == 0)
{
return 0;
}

int length = str.length();
int beginIndex = 0;
int sign = 1;
for (int i = 0; i < length; i++)
{
char ch = str.charAt(i);
if (ch == ' ')
{
continue;
}

if (ch == '-')
{
sign = -1;
beginIndex = i + 1;
break;
}

if (ch == '+')
{
beginIndex = i + 1;
break;
}

if (ch >= '0' && ch <= '9')
{
beginIndex = i;
break;
}

return 0;
}

int result = 0;
for (int i = beginIndex; i < length; i++)
{
char ch = str.charAt(i);
if (ch < '0' || ch > '9')
{
break;
}

if (sign == -1)
{
if ((Integer.MIN_VALUE + ch - '0') / 10 > result)
{
result = Integer.MIN_VALUE;
break;
}
}
else
{
if ((Integer.MAX_VALUE - (ch - '0')) / 10 < result)
{
result = Integer.MAX_VALUE;
break;
}
}
result = result * 10 + sign * (ch - '0');
}

return result;
}
}