leetcode刷题40

今天刷的题是LeetCode第8题,字符串转整数

这个题比较麻烦,我自己的代码有些考虑不全,如下:

public class MyAtoi_8_middle {public static int solution(String str){
        String maxNum=String.valueOf(Integer.MAX_VALUE);
        String minNum=String.valueOf(Integer.MIN_VALUE);
        if (str.length()==0)return 0;
        int n=str.length();
        int i=0;
        boolean flag=true;//该数据是正数
        StringBuilder result=new StringBuilder();
        boolean observation=false;//是数字或是负号的时都是true,其他时候转为false
        while (i<n&&str.charAt(i)!='-'&&(str.charAt(i)<'0'||str.charAt(i)>'9')){
            i++;
        }
        str=str.substring(i,n);
        n=str.length();
        i=0;
        if (str.length()==0||(str.length()==1&&str.charAt(0)=='-'))return 0;
        if (str.charAt(i)=='-'){
            if (str.charAt(1)>='0'&&str.charAt(1)<='9'){
                //是一个负数
                i++;
                flag=false;
            }else {
                   
            }
        }
        while (i<n){
            if (str.charAt(i)>='0'&&str.charAt(i)<='9'){
                result.append(str.charAt(i));
                i++;
            }else {
                break;
            }
        }
        if (!flag){
            result.insert(0,'-');
        }
        if (flag){
            //是一个正数
            if (result.length()<maxNum.length()){
                return Integer.parseInt(result.toString());
            }else if (result.length()>maxNum.length()){
                return Integer.MAX_VALUE;
            }else {
                if (compare(result.toString(),maxNum,true)){
                    return    Integer.parseInt(result.toString());
                }else {
                    return Integer.MAX_VALUE;
                }
            }
        }else {
            //是一个负数
            if (result.length()<minNum.length()){
                return Integer.parseInt(result.toString());
            }else if (result.length()>minNum.length()){
                return Integer.MIN_VALUE;
            }else {
                if (compare(result.toString(),minNum,false)){
                    return   Integer.parseInt(result.toString());
                }else {
                    return Integer.MIN_VALUE;
                }
            }
        }
    }
    public static boolean compare(String s1,String s2,boolean flag){
        int n=s1.length();
        boolean result=true;
        int start=flag?0:1;
        while (start<n){
            int num1=Integer.parseInt(String.valueOf(s1.charAt(start)));
            int num2=Integer.parseInt(String.valueOf(s2.charAt(start)));
            if (num1>num2){
                result=false;
                break;
            }
            start++;
        }
        return result;
    }
}

这个总是有点儿问题,然后是借鉴了别人的代码,如下

class Solution {
   public static int myAtoi(String str) {
        char[] seq=str.trim().toCharArray();
        if(seq.length==0 || (seq[0]<'0' ||seq[0]>'9')&&seq[0]!='-'&&seq[0]!='+') return 0;
        int flag=1;
        int result=0;
        for(int i=0;i<seq.length;i++){
            if(seq[i]=='-' && i==0) {
                flag=-1;
                continue;
            }
            if(seq[i]=='+' && i==0) continue;
            if(seq[i]<'0' ||seq[i]>'9') break;
            if(result*flag>Integer.MAX_VALUE/10||(result*flag==Integer.MAX_VALUE/10&&(seq[i]-'0')>Integer.MAX_VALUE%10)) return Integer.MAX_VALUE;
            if(result*flag<Integer.MIN_VALUE/10||(result*flag==Integer.MIN_VALUE/10&&(seq[i]-'0')*flag<Integer.MIN_VALUE%10)) return Integer.MIN_VALUE;
            result=result*10+seq[i]-'0';
        }
        return result*flag;
    }
}
原文地址:https://www.cnblogs.com/cquer-xjtuer-lys/p/11612812.html