力扣刷题笔记-08 字符串转整数
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 < 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. 从第几位开始处理数字
从第几位开始,要考虑一下几种情况,这些情况都是去除了空格位前提
- 首位有正号或者负号,那就要startIndex=1
- 首位没有,其实此时就是正数,那么startIndex = 0;
所以我们的处理方案是:startIndex默认位0,sign默认位1.