String to Integer(atoi)

我的代码:l为字符串中第一个数字的位置,r为最后一个数字的位置。用substring方法将这段为数字的字符截取,然后利用了parseInt方法在越界的时候会报异常来处理越界情况。

class Solution {
public int myAtoi(String str) {
String t=str.trim();
if(t.length()==0)
return 0;
else if((t.charAt(0)=='-')){
if(t.length()==1)
return 0;
else{
if(!(t.charAt(1)>='0'&&t.charAt(1)<='9'))
return 0;
}
}
else if(t.charAt(0)=='+'){
if(t.length()==1)
return 0;
else{
if(!(t.charAt(1)>='0'&&t.charAt(1)<='9'))
return 0;
}
}
else{
if(!(t.charAt(0)>='0'&&t.charAt(0)<='9'))
return 0;
}
int ans=0,r=0,l=0;
boolean flag=false;
if(t.charAt(0)=='-'||t.charAt(0)=='+'){
r=l=1;
if(t.charAt(0)=='-')
flag=true;
}
for(int i=l;i<t.length();i++){
if(t.charAt(i)>='0'&&t.charAt(i)<='9')
r++;
else
break;
}
String endAns=t.substring(0,r);
try{
ans=Integer.parseInt(endAns);
return ans;
}
catch(Exception e){
if(flag)
return Integer.MIN_VALUE;
else
return Integer.MAX_VALUE;
}
}
}

Dicuss中的代码:没有利用substring和parseInt,而是直接用while循环来求值并判断是否越界。特别注意计算机是从左向右计算的,因此要想判断越界与否,应该写成ans*10>max-rem而不是ans*10+rem>max。虽然这从逻辑上看是一样的,但是计算机只能从左到右计算,因此第二句代码会导致即使左边越界,判断的结果也一定是false。

class Solution {
public int myAtoi(String str) {
String t=str.trim();
if(t.length()==0)
return 0;
int ans=0,flag=1,i=0,max=Integer.MAX_VALUE,min=Integer.MIN_VALUE;
if((t.charAt(0)=='-')){
i++;
flag=-1;
}
if(t.charAt(0)=='+')
i++;
while(i<t.length()){
if(!Character.isDigit(t.charAt(i)))
break;
int rem=t.charAt(i)-'0';
if(flag==1){
if(ans>max/10||ans*10>max-rem){
System.out.println(flag);
return max;
}
}
else{
if(-ans<min/10||-ans*10<min+rem)
return min;
}
ans*=10;
ans+=rem;
i++;
}
return flag*ans;
}
}

上一篇:C++中atoi()函数的用法


下一篇:[LeetCode 8.] 字符串转换整数 (atoi)