题目
输入一个字符串,把字符串转换成整数;
实现
思路:
从左到右扫描字符串中的每个字符,把之前扫描得到的数字*10+当前字符表示的数字;
细节:
- 判断字符串中是否有空格;
- 字符串第一个字符是否为符号位;
- 输入的字符不能不是数字;
- 输入的字符太长,可能转换成整数后,会导致整数溢出;
溢出问题:
一般来说,当发生溢出后取最大/最小int型值,即大于正整数能表示的范围时返回MAX_INT(2147483647);小于负整数能表示的范围时返回MIM_INT(-2147483648);
sign符号
n转换后的结果;
c当前数字
可能的溢出处理:
if(sign=='+'&&c>MAX_INT-n*10)
{
n=MAX_INT;
break;
}
if(sign=='-'&&c-1>MAX_INT-n*10)
{
n=MIN_INT;
break;
}
上述处理存在问题:因为n*10可能超出MAX_INT;
主要有2种方式处理溢出问题:
1)n设定为long类型;
2)比较n和MAX_INT/10:
若n>MAX_INT/10,说明在进行当前转换时,必然会溢出;
若n==MAX_INT/10,则比较c和MAX_INT%10,如果c>MAX_INT%10,则溢出;
方法1 设定n为long类型
public static long Atoi(String s){
char first=s.charAt(0);
int neg=0;
int i=0;
//
if(first=='-'){
neg=1;
i++;
}else if(first=='+'){
neg=0;
i++;
}
long num=0;
for(;i<s.length();i++){
if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
num=num*10+s.charAt(i)-'0';
}else{
System.out.println("illegal number");
return 0;
}
}
if(neg==1){
num=-num;
}
return num;
}
方法2
public static int strToInt(String str){
int sign=1;
//空的字符串
if(str==""){
return 0;
}
//处理空格
String s=str.trim();
//符号问题
int i=0;
if(s.charAt(i)=='-'||s.charAt(i)=='+'){
if(s.charAt(i)=='-'){
sign=-1;
}
i++;
}
//开始转换
int n=0;
for(;i<s.length();i++){
//如果是数字,才进行转换
if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
int c=s.charAt(i)-'0';
if(sign>0 && (n>Integer.MAX_VALUE/10 ||(n==Integer.MAX_VALUE /10&& c>Integer.MAX_VALUE%10) )){
n=Integer.MAX_VALUE;
break;
}else if(sign<0 && (n>Integer.MAX_VALUE/10 || (n==Integer.MAX_VALUE/10 && c-1>Integer.MAX_VALUE%10))){
n=Integer.MIN_VALUE;
break;
}
n=n*10+c;
}
}
return sign>0?n:-n;
}