zoukankan      html  css  js  c++  java
  • 【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;
            }
        }
    
    }
  • 相关阅读:
    POJ 1321:棋盘问题
    POJ 2251:Dungeon Master
    POJ 3438:Look and Say
    POJ 1094:Sorting It All Out拓扑排序之我在这里挖了一个大大的坑
    杭电1285--确定比赛名次(拓扑排序)
    南阳67--三角形面积
    南阳38--布线问题
    杭电1050--Moving Tables(区间覆盖)
    杭电1217--Arbitrage(Spfa)
    杭电1719--Friend(找规律)
  • 原文地址:https://www.cnblogs.com/godlei/p/5568175.html
Copyright © 2011-2022 走看看