package com.example.demo.leecode;
/**
 * 字符串转整数
 * @Date 2020/11/25
 * @author Tang
 *
 * 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
 *
 * 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
 * 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
 * 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
 * 注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
 *
 * 在任何情况下,若函数不能进行有效的转换时,请返回 0 。
 *
 * 提示:
 *
 * 本题中的空白字符只包括空格字符 ' ' 。
 * 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。
 */
public class StringToInteger {
    String str;
    int index = 1;
    public int change(String s){
        //字符串为null情况
        if(s == null){
            return 0;
        }
        this.str = s.trim();
        char[] chars = str.toCharArray();
        //都是空格字符情况
        if (chars.length == 0){
            return 0;
        }
        //如果首字母是符号
        if(ifSymbol(chars[0])){
           getIndex(chars);
        }else if(ifNum(chars[0])){
            //去掉开头的所有0
            chars = getNoZeroBegin(chars, 0);
            if(chars.length == 0){
                return 0;
            }
            //去掉0后还非法
            if(ifSymbol(chars[0]) || !ifNum(chars[0])){
                return 0;
            }
            getIndex(chars);
        }else{
            return 0;
        }
        ///只有一个符号位,后边没有数字
        if(index == 0 && ifSymbol(chars[0])){
            return 0;
        }
        int res = 0;
        String result = String.valueOf(chars, 0, index+1);
        try {
           res  = Integer.parseInt(result);
        }catch (Exception e){
            if(chars[0] == '-'){
                return Integer.MIN_VALUE;
            }else{
                return Integer.MAX_VALUE;
            }
        }
        return res;
    }
    //获取要截取数字的结束位置
    private void getIndex(char[] chars){
        for(;index < chars.length; index++){
            if(!ifNum(chars[index])){
                break;
            }
        }
        index --;
    }
    //递归获取首字符为0的字符数组
    private char[] getNoZeroBegin(char[] chars, int index){
        if(chars.length == 0){
            return chars;
        }
        if(chars[index] == '0'){
            String s = String.valueOf(chars, index+1 , chars.length - index-1);
            chars = s.toCharArray();
            chars = getNoZeroBegin(chars, index);
        }
        return chars;
    }
    /**
     * 判断是否为正负号
     * @param c
     * @return
     */
    private boolean ifSymbol(char c){
        return c == '+' || c == '-';
    }
    /**
     * 判断是否是数字
     * @return
     */
    private boolean ifNum(char c){
        return c > '0' && c < '9';
    }
    public static void main(String[] args) {
        //应输出42
        String value1 = "42";
        //应输出-42
        String value2 = "   -42";
        //应输出4193
        String value3 = "000cc4193 with words";
        //应输出0
        String value4 =  "words and 987";
        //应输出0
        String value5 = null;
        //应输出0
        String value6 = "     0000000000000   ";
        StringToInteger stringToInteger = new StringToInteger();
        int change = stringToInteger.change(value6);
        System.out.println(change);
    }
}