(1)输入的可能是空字符串。
(2)整数不仅仅含有数字,还可能以 + 或者 - 开头,表示整数的正负。因此需要对字符串的第一个字符做特殊处理。
(3)输入的字符串中可能含有不是数字的字符。
(4)溢出问题,超过整数的最大范围。
public class test {
public static boolean flag;
public static int StrToInt(String str) {
flag = false;//flag判断是因为输入字符串0返回0 还是错误情况下直接返回0
//判断输入是否合法
if (str == null || str.trim().equals("")) {
flag = true;
return 0;
}
// symbol=0,说明该数为正数;symbol=1,该数为负数;start用来区分第一位是否为符号位
int symbol = 0;
int start = 0;
char[] chars = str.trim().toCharArray();
if (chars[0] == '+') {
start = 1;
} else if (chars[0] == '-') {
start = 1;
symbol = 1;
}
int result = 0;
for (int i = start; i < chars.length; i++) {
if (chars[i] > '9' || chars[i] < '0') {
flag = true;
return 0;
}
int sum= result * 10 + (int) (chars[i] - '0');
//判断是否溢出,举个例子,3*10+5=35,如果(35-5)/10不等于3,那么就产生了溢出
if((sum-(int) (chars[i] - '0'))/10!=result){
flag=true;
return 0;
}
result=result * 10 + (int) (chars[i] - '0');
/*
* 本人认为java热门第一判断是否溢出是错误的,举个反例
* 当输入为value=2147483648时,在计算机内部的表示应该是-2147483648
* 显然value>Integer.MAX_VALUE是不成立的
*/
}
// 注意:java中-1的n次方不能用:(-1)^n .'^'异或运算
// 注意,当value=-2147483648时,value=-value
result = (int) Math.pow(-1, symbol) * result;
return result;
}
public static void main(String [] args)
{
System.out.println(StrToInt("123456789012345678901234567890123456789012345678901234567890"));
}
}
或者
public class test
{
public static int StringtoInt(String str)
{
int result = 0;
if(str == null || str.length()==0 || str.equals(""))
return 0;
char [] charArray = str.toCharArray(); //将字符串转化为字符数组
boolean flag = true; //判别整数符号的标志
int start = 0; //首位字符若为数字,字符数组索引从0开始
if(charArray[0]=='-' || charArray[0]=='+')
{
start = 1;//首位字符为+或-,则字符数组索引从1开始
if(charArray[0] == '-')
flag = false;
}
//字符'0'对应的ASCII码值是48(转化为int类型),而字符'9'对应的ASCII码值是57
for(int i= start; i<charArray.length; i++)
{
if(charArray[i]<48 || charArray[i]>57)//输入非法字符串
return 0;
int sum= result * 10 + (int) (charArray[i] - 48);//将字符转化为对应的数字:每向后推进一位,sum乘10再加;字符转换为对应的ASCII码值再运算
//判断是否溢出
if((sum-(int) (charArray[i] - 48))/10!=result){
flag=true;
return 0;
}
result=result * 10 + (int) (charArray[i] - 48);
}
return result = flag ? result:result*(-1);//三元运算符号
}
public static void main(String [] args)
{
System.out.println(StringtoInt("123456789012345678901234567890123456789012345678901234567890"));
}
}
输出均为0。
参考链接:https://www.nowcoder.com/questionTerminal/1277c681251b4372bdef344468e4f26e
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数
剑指Offer(Java版)第五十五题:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。