leetcode8. String to Integer (atoi)

Posted godlei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode8. 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;
        }
    }

}

 

以上是关于leetcode8. String to Integer (atoi)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode8.String to Integer (atoi)

LeetCode8. String to Integer (atoi)

LeetCode8. String to Integer (atoi)

leetcode8. String to Integer (atoi)

Leetcode8 String to Integer(atoi)

LeetCode8. String to Integer (atoi) 字符串转整数