08 字符串转整数属于对字符串进行操作的问题
百无一用是情深
问题
字符串里有数字,空格,正负号等,需要先过滤出来
在这道题目里,我们通常考虑字符串的组合是 “空格+正负号+数字”,一开始我想可能是“正负号+空格+数字”,但是这样的组合根本不可能是数字啊,没什么意义。
循环条件
- for循环
- 字符串去除空格之后的length
- 起始位置取决于字符串有没有正负号
思路
- 去掉空格,判断长度
- 判断有没有正负号,决定startIndex从0还是1开始
- 遍历数字,拼接成整数:res = res * 10 + temp,类似于上面的整数反转
- 返回的时候把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. 从第几位开始处理数字
从第几位开始,要考虑一下几种情况,这些情况都是去除了空格位前提
- 首位有正号或者负号,那就要startIndex=1
- 首位没有,其实此时就是正数,那么startIndex = 0;
所以我们的处理方案是:startIndex默认位0,sign默认位1.