力扣刷题笔记-08 字符串转整数

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 < s.length(); i++){
            // temp用来临时接收每个位置上的字符
            char temp = s.charAt(i);
            if (!Character.isDigit(temp)){
                break;
            }
            
            // 在循环内部,暂时没有考虑负号,只有在满足if条件,也就是绝对值溢出了,再去考虑正负号
            // (temp - '0') > 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 < Integer.MIN_VALUE/10 || (res == Integer.MIN_VALUE/10 && (temp - '0') > 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 point

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

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

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

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

posted @ 2023-10-08 15:37  大海0101  阅读(19)  评论(0编辑  收藏  举报