一、题目
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
输入描述:输入一个字符串,包括数字字母符号,可以为空
输出描述:如果是合法的数值表达则返回该数字,否则返回 0
二、思路
如果是一个只含有数字的字符串,转换成数字很简单。从左到右每次取一位字符 digit,利用 result = result * 10 + digit 最后计算出整个数字。期间要处理的关键问题是正负数的数值越界问题。
正负数问题:
建立一个 flag 标志,若字符串的第一个字符为 ‘-’,flag = 1,表示负数;否则,flag = 0,表示正数。
正负数数值越界问题:
数值越界,即大于 2147483647(利用 Integer.MAX_VALUE 得到),或小于 -2147483648。观察程序发现,每次循环时 result 的值都会扩大10倍然后加上当前读到的字符 digit ,得到一个结果。所以,我们就可以利用 INT_MAX / 10 的值来提前一步判断是否会越界,如下:
- 当 result > MAX_VALUE / 10 时,说明本次循环扩大 10 倍后,不管加不加当前读到的字符位,result 都必将越界(超过 INT_MAX);
- 当 result = MAX_VALUE / 10 时,本次循环扩大 10 倍后,则还要根据当前读到的字符位 digit 来进行判断:正数的话,当 digit > 7 时,越界;负数的话,当 digit > 8 时,越界。
两条判断语句分别为:
// 正数的越界判断
if(flag == 0 && (result > Integer.MAX_VALUE/10 || result == Integer.MAX_VALUE / 10 && c[i] > 55))
return 0;
// 负数的越界判断
if(flag == 1 && (result > Integer.MAX_VALUE/10 || result == Integer.MAX_VALUE / 10 && c[i] > 56))
return 0;
三、代码
public class Solution {
public int StrToInt(String str) {
if(str.length() == 0 || str.equals(""))
return 0;
char[] c = str.toCharArray();
int result = 0;
int flag = 0;// 符号位标志位,0表示正数,1表示负数
if(c[0] == '-')
flag = 1;
//
for(int i = flag; i < c.length; i++){
if(c[i] == '+')
continue;
if(c[i] < 48 || c[i] > 57)
return 0;
// 正数的越界判断
if(flag == 0 && (result > Integer.MAX_VALUE/10 || result == Integer.MAX_VALUE / 10 && c[i] > 55))
return 0;
// 负数的越界判断
if(flag == 1 && (result > Integer.MAX_VALUE/10 || result == Integer.MAX_VALUE / 10 && c[i] > 56))
return 0;
result = result * 10 + c[i] - 48;
}
return flag == 0 ? result : result * (-1);
}
}