将整数字符串转成整数值
题目描述:
给定一个字符串str,如果str符合日常书写的整数形式,并且属于32位整数的范围,返回str所代表的整数值,否则返回0。
【举例】
str=“123”,返回123。
str=“023”,因为"023"不符合日常的书写习惯,所以返回0。
str=“A13”,返回0。
str=“0”,返回0。
str=“2147483647”,返回2147483647。
str=“2147483648”,因为溢出了,所以返回0。
str="-123",返回-123。
题目难度:
题目思路:
- 将给定字符串转为字符数组;
- 判断该数组是否符合要求,即:①首位为“-”,长度为1或者-0的情况;②首位为“-”,下一位不是数字;③首位不是数字;④从第二位开始其他位是否符合要求。判断该数组是否符合要求,即:①首位为“-”,长度为1或者-0的情况;②首位为“-”,下一位不是数字;③首位不是数字;④从第二位开始其他位是否符合要求。
- 如果不符合要求,直接返回0;如果不符合要求,直接返回0;
- 如果符合要求:就需要进行边界判断。如果符合要求:就需要进行边界判断。
- 进行边界判断:先判断是正数还是负数,以便接下来取位。然后将所有的数都变为负数,因为负数的绝对值比正数大1;一旦发生越界,就不用进行加操作了,直接返回0;如果没有越界,且是正数的时候,还要判断是否转负后与最小值相等,如果是,也返回0;进行边界判断:先判断是正数还是负数,以便接下来取位。然后将所有的数都变为负数,因为负数的绝对值比正数大1;一旦发生越界,就不用进行加操作了,直接返回0;如果没有越界,且是正数的时候,还要判断是否转负后与最小值相等,如果是,也返回0;
- 最后如果是正数,则取负。返回最终转化的整数结果。最后如果是正数,则取负。返回最终转化的整数结果。
代码实现:
public static int convert(String string) {
if (string == null || string.length() == 0) {
return 0;
}
char[] chs = string.toCharArray();
if (!isValid(chs)) {
return 0;
}
boolean positive = chs[0] != '-';
int minH = Integer.MIN_VALUE / 10;
int minT = Integer.MIN_VALUE % 10;
int res = 0;
for (int i = positive ? 0 : 1; i < chs.length; i++) {
int cur = '0' - chs[i];
if ((minH > res) || (minH == res && cur < minT)) {
return 0; //要进行边界判断,如果当前值超出了最小值的范围,就不用接下来的加操作了
}
res = res * 10 + cur;
}
if (positive && res == Integer.MIN_VALUE){
return 0;
}
return positive? -res : res;
}
private static boolean isValid(char[] chs) {
if (chs[0] == '-' && (chs.length == 1 || chs[1] == 0)) {
return false;
}
if (chs[0] != '-' && (chs[0] < '0' || chs[0] > '9')) {
return false;
}
if (chs[0] == '0' && chs.length > 1){
return false;
}
for (int i = 1; i < chs.length; i++) {
if (chs[i] < '0' || chs[i] > '9') {
return false;
}
}
return true;
}