08 字符串转整数属于对字符串进行操作的问题

百无一用是情深

问题

字符串里有数字,空格,正负号等,需要先过滤出来

在这道题目里,我们通常考虑字符串的组合是 “空格+正负号+数字”,一开始我想可能是“正负号+空格+数字”,但是这样的组合根本不可能是数字啊,没什么意义。

循环条件

  1. for循环
  2. 字符串去除空格之后的length
  3. 起始位置取决于字符串有没有正负号

思路

  1. 去掉空格,判断长度
  2. 判断有没有正负号,决定startIndex从0还是1开始
  3. 遍历数字,拼接成整数:res = res * 10 + temp,类似于上面的整数反转
  4. 返回的时候把sign加上

code

public int myAtoi(String s) {        s = s.trim();        // 判断字符串是不是为空        if (s.isEmpty()){            return 0;        }        char firstChar = s.charAt(0);        // 去除空格后,第一个字符如果既不是正负号也不是数字,那就返回0        if (firstChar != '+' && firstChar != '-' && !Character.isDigit(firstChar)){            return 0;        }        int res = 0;        int sign = 1;        // 这里要设置一个startIndex,因为正号可以不写,如果是正号,就要从第0位开始循环        int startIndex = 0;        if (firstChar == '-' || firstChar == '+'){            // 说明有符号,正号或者负号都有可能,那么数字起始位就要向后挪一位            startIndex = 1;            sign  = (firstChar == '-') ? -1 : 1;        }                // 遍历,从1开始是因为前面认为是符号位        for (int i = startIndex; i  7,即使是负数,也就是最后一位是8,那么也一定越界,所以可以覆盖正负数。            if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (temp - '0') > 7)){                return (sign == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE;            }            /**             * 注释掉的这部分犯了个错误             * 错在,整个for循环里面并没有将数字添加正负号,所以所有的数字都是整数,只需要考虑正整数溢出的情况             *///            if (sign == -1){//                // 说明是负数,看当前值是不是超越了边界情况//                if (res  8 )){//                    return Integer.MIN_VALUE;//                }//            } else {//                if (res > Integer.MAX_VALUE || (res == Integer.MAX_VALUE && (temp - '0') > 7)){//                    return Integer.MAX_VALUE;//                }//            }            res = res * 10 + (temp - '0');        }  // 把符号考虑进来        return res * sign;     }

key point1. 在循环内部,并没有正负号,所以在判断越界的情况,只需要考虑绝对值是不是超过了,就是result> Integer.MAX_VALUE这个情况2. 从第几位开始处理数字

从第几位开始,要考虑一下几种情况,这些情况都是去除了空格位前提

  1. 首位有正号或者负号,那就要startIndex=1
  2. 首位没有,其实此时就是正数,那么startIndex = 0;

所以我们的处理方案是:startIndex默认位0,sign默认位1.