字符串问题——将整数字符串转换成整数值

题目:给定一个字符串str,如果其符合日常书写的整数形式,并且属于32位(int型4字节)整数范围内,返回str所代表的整数值,否则返回0。

实现
步骤一:先判断字符转整数的有效性

  1. 如果str不以’-‘开头,也不以数字开头,则返回false。
  2. 如果str以’-‘开头,但是长度为1;或长度大于1,但后面紧跟的是’0’,则返回false;
  3. 如果str以’0’开头,但str长度大于1,则返回false。
  4. 然后检查str[1,..N-1]是否是数字字符,如果有一个不是,则返回false;如果都是数字字符,则返回true。
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
public class ConvertToInt {
/**
* 先验证字符转数字的有效型
* @param chas 字符串转成的字符数组
* @return 字符串是否能转成整数值
*/
public boolean isValid (char[] chas) {
if (chas[0] != '-' && (chas[0]<'0' || chas[0]>'9')) {
return false;
}
if (chas[0] == '-' && (chas.length == 1 || chas[1] == '0')) {
return false;
}
if (chas[0] == '0' && chas.length > 1) {
return false;
}
for (int i = 0; i < chas.length; i++) {
if (chas[i] < '0' || chas[i] > '9') {
return false;
}
}
return true;
}
/**
* 将字符串转整数值
* @param str
* @return
*/
public int convert (String str) {
if (str == null || str.equals("")) {
return 0;
}
char[] chas = str.toCharArray();
if (!isValid(chas)) {
return 0; //不能转
}
//判断数字的正负
boolean posi = chas[0] == '-' ? false : true;
//由于32位负的最大值的绝对值比正的最大值的绝对值大1,因此全程用负数计算
//这一步主要是将个位的数字单独考虑
int minq = Integer.MIN_VALUE / 10;
int minr = Integer.MIN_VALUE % 10;
int rst = 0;
int cur = 0;
for (int i = posi ? 0 : 1; i < chas.length; i++) {
cur = '0' - chas[i]; //当前字符的负数形式
if (rst < minq || (rst == minq && cur < minr)) {
return 0;
}
rst += rst * 10 + cur;
}
if (posi && rst == Integer.MIN_VALUE) { //正数由于比负数小1,所以刚好相等的数值不能旋转
return 0; //不能旋转
}
return posi ? -rst :rst; //posi为true则返回正数,前面加'-'
}
}