【leetcode】8. String to Integer (atoi)

题目描述:

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

解题思路:

    这道题简直让人抓狂!试了许多次都没有通过,原因是要考虑多种情况。主要考虑的因数有:

  1. 要考虑前几个或全部字符都是空白字符的情况;
  2. 要考虑第一个字符是+,-,还是0-9的字母,或是其他字符;
  3. 要考虑有没有值得溢出,尤其是最小值溢出;
  4. 若中间有非数字字符,要返回之前的数字,如“123a34”要返回123;
  5. 若以若干个0开始,则0要忽略,如“-0000234”要返回-234

  找出这几种情况之后,就代码就不难写了。总之这道题AC率很低的原因并不是逻辑有多难,而是很难考虑到全部的情况。

具体代码:

public class Solution {
      public static int myAtoi(String str) {
          //取出两边空白字符
         str=str.trim();
         if(str==null||str.length()==0)
             return 0;
         if(str.length()==1){
             if(str.charAt(0)>='0' && str.charAt(0)<='9')
                 return Integer.valueOf(str);
             else
                 return 0;
         }
         //第一个字符是'+
         if(str.charAt(0)=='+'){
             String s = str.substring(1);
             if(isValid(s)){
                 s=fun(s);
                 if(s==null)
                     return 0;
                 MyCompatator m = new MyCompatator();
                 if(m.compare(s, ""+Integer.MAX_VALUE)>=0){
                     return Integer.MAX_VALUE;
                 }
                 else{
                     return Integer.valueOf(s);
                 }
             }
             else{
                 s=fun1(s);
                 if(s==null)
                     return 0;
                 s=fun(s);
                 if(s==null)
                     return 0;
                 MyCompatator m = new MyCompatator();
                 if(m.compare(s, ""+Integer.MAX_VALUE)>=0){
                     return Integer.MAX_VALUE;
                 }
                 else{
                     return Integer.valueOf(s);
                 }
             }
         }
         //第一个字符是'-
         else if(str.charAt(0)=='-'){
             String s = str.substring(1);
             if(isValid(s)){
                 s=fun(s);
                 if(s==null)
                     return 0;
                 MyCompatator m = new MyCompatator();
                 StringBuilder sb =new StringBuilder(""+Integer.MIN_VALUE);
                 sb.deleteCharAt(0);
                 String ss=sb.toString();
                 if(m.compare(s, ss)>=0)
                     return Integer.MIN_VALUE;
                 else{
                     return Integer.valueOf(str);
                 }
             }
             else{
                 s=fun1(s);
                 if(s==null)
                     return 0;
                 s=fun(s);
                 if(s==null)
                     return 0;
                 MyCompatator m = new MyCompatator();
                 StringBuilder sb =new StringBuilder(""+Integer.MIN_VALUE);
                 sb.deleteCharAt(0);
                 String ss=sb.toString();
                 if(m.compare(s, ss)>=0)
                     return Integer.MIN_VALUE;
                 else{
                     return Integer.valueOf("-"+s);
                 }
             }
         }
         //第一个字符是数字
         else if(str.charAt(0)>='0' && str.charAt(0)<='9'){
             if(isValid(str)){
                 str=fun(str);
                 if(str==null)
                     return 0;
                 MyCompatator m = new MyCompatator();
                 if(m.compare(str, ""+Integer.MAX_VALUE)>=0){
                     return Integer.MAX_VALUE;
                 }
                 else{
                     return Integer.valueOf(str);
                 }
             }
             else{
                 str=fun1(str);
                 if(str==null)
                     return 0;
                 str=fun(str);
                 if(str==null)
                     return 0;
                 MyCompatator m = new MyCompatator();
                 if(m.compare(str, ""+Integer.MAX_VALUE)>=0){
                     return Integer.MAX_VALUE;
                 }
                 else{
                     return Integer.valueOf(str);
                 }
             }
         }
         //第一个字符是其他数字则出错
         else{
             return 0;
         }
        
     }
     //判断字符串是否是由数字组成的
     public static boolean isValid(String s){
         //return s.matches("[1-9][0-9]*");
         return s.matches("[0-9]+");
     }
     //将数字串开始的0全部去掉
     public static String fun(String s){
         int index=0;
         boolean key=false;
         for(index=0;index<s.length();index++){
             if(s.charAt(index)!='0'){
                 key=true;
                 break;
             }
         }
         if(key){
             return s.substring(index);
         }
         else{
             return null;
         }
     }
     //截取第一个不是数字字符之前的数字
     public static String fun1(String s){
         int index=0;
         for(index=0;s.charAt(index)>='0'&&s.charAt(index)<='9';index++){
             
         }
         if(index==0)
             return null;
         return s.substring(0,index);
     }
}
class MyCompatator implements Comparator<String>{

    @Override
    public int compare(String s1, String s2) {
        if(s1.length()>s2.length()){
            return 1;
        }
        else if(s1.length()<s2.length()){
            return -1;
        }
        else{
            
            for(int i=0;i<s1.length();i++){
                if(s1.charAt(i) - s2.charAt(i) >0)
                    return 1;
                else if(s1.charAt(i) - s2.charAt(i) <0)
                    return -1;
                else
                    ;
            }
            return 0;
        }
    }

}
原文地址:https://www.cnblogs.com/godlei/p/5568175.html