8.[LeetCode]String to Integer (atoi)

来源:互联网 发布:怎么申请农村淘宝 编辑:程序博客网 时间:2024/06/03 07:45

这道题看似简单但是其实要考虑各种各样的情况,代码较长

public class Solution {    public int myAtoi(String str) {        char[] newstr = str.toCharArray();        int size = newstr.length;        boolean isPos = true; // 当前数字是正还是负数        boolean allWhite = true;        int first = 0;        int last = 0;        for(int i=0;i<size;i++){            if(newstr[i] != ' ') {                allWhite = false;                if(newstr[i] == '+') { // 如果遇到了+号,那么判断下一位是否存 && 是不是数字,不是退出返回0                    if(i+1<size && isNumber(newstr[i+1])){                        first = i+1;                        break;                    } else {                        return 0;                    }                } else if(i+1<size && newstr[i] == '-'){ // 和加号判断同理                    if(isNumber(newstr[i+1])){                        first = i+1;                        isPos = false;                        break;                    } else {                        return 0;                    }                } else if(isNumber(newstr[i])){                    first = i;                    break;                } else { // 不是 + - 数字中的任何一个则,返回0                    return 0;                }            }        }        // 如果是全空格状态,返回0        if(allWhite) {            return 0;        }        last = first+1; // 目前的最后一位是在 first的位的下一个        // 获取到第一个数字的位置为 first,那么我们从first开始遍历,获取最后一个数字的位置        for(int i=first;i<size;i++){            if(!isNumber(newstr[i])){                // 如果当前不是数字了,或者是到了最后一位了,那么break,当前位置的前一个为last,也就是最后一个数字位                last = i;                break;            }            if(i == size-1){ // 如果到了最后一位都是数字,那么last就是size                last = size;            }        }        // 获取数字子串        String numberStr = str.substring(first,last); // 这里明确substring的范围问题,最后一个之后的位置也是可以取的        char[] numbers = numberStr.toCharArray();        int numberSize = numbers.length;        int finalNumber = 0;        if(numberSize <= 10){ // 在最长位,10位之内            // todo 转换并输出结果            for(int i=0;i<numberSize;i++){                int temp = (int)(numbers[i]-'0');                if(i==9){ // 如果到了最后一位的话                    if(finalNumber > 214748364) { // 大于那么一定是超出的                        finalNumber = (isPos)?Integer.MAX_VALUE:Integer.MIN_VALUE;                    } else if (finalNumber == 214748364){ //等于的话,就要判断当前位置的数字的大小                        if((isPos && temp <= 7) || (!isPos && temp <= 8)){                            // 满足条件                            finalNumber = finalNumber*10 + temp;                               if(i == numberSize-1){ // 如果到了最后一位,就转换正负号                                finalNumber = (isPos)?finalNumber:-finalNumber;                            }                        } else {                            // 超出范围                            finalNumber = (isPos)?Integer.MAX_VALUE:Integer.MIN_VALUE;                        }                    } else { // 小于的情况下,尽然亡了考虑                        finalNumber = finalNumber*10 + temp;                           if(i == numberSize-1){ // 如果到了最后一位,就转换正负号                            finalNumber = (isPos)?finalNumber:-finalNumber;                        }                    }                } else {                    finalNumber = finalNumber*10 + temp;                       if(i == numberSize-1){ // 如果到了最后一位,就转换正负号                        finalNumber = (isPos)?finalNumber:-finalNumber;                    }                }            }        } else if(numberSize > 10){ // 如果长度限制都超出了,那么直接判断大小            // todo 根据正负号输出最大和最小            finalNumber = (isPos)?Integer.MAX_VALUE:Integer.MIN_VALUE;        }        return finalNumber;    }    private boolean isNumber(char t){        if(t <= '9' && t >= '0') return true;        return false;    }}
0 0
原创粉丝点击