题目信息
解题思路
这是一道中等题,需要判断和考虑的东西很多。我们一一列举出来。
1、需要先去除首位的空字符,这个很容易,用trim()方法就好。
2、如果遇到的第一个非空字符为‘-’或者‘+’时,把后面的数字连接起来。
3、如果遇到的第一个非空字符不是数字或正、负号。就说明是非法的直接返回0
4、越界问题,题目给的环境是int类型的数字其数值范围为 [−231, 231 − 1],如果越界了就需要返回最大的int值或者最小的int值。
代码和详细注释如下
class Solution{
public int strToInt(String str) {
//首先去除str首位多余的空格,再转成字符数组
char []array=str.trim().toCharArray();
//要是str长度不合法,直接返回0
if(array.length==0){
return 0;
}
//sign为标志位,1为正,-1为负, i代表数组array从何处开始遍历
int sign=1;
//res最终数字的结果
int res=0;
int i=1;
//设置一个限制值,因为要先在遍历的时候判断res是不是越界了,最后才向res赋值
int limit=Integer.MAX_VALUE/10;
//如果array[0] == '-'就说明是负数把sign改成-1;
if(array[0]=='-'){
sign=-1;
}
//如果也不是+那要遍历的判断了,所以让i=0,从第一个开始遍历判断
else if(array[0]!='+'){
i=0;
}
for (int j = i; j <array.length ; j++) {
//判断当前字符j是不是数字,不是就直接 退出,
if(array[j]>'9' || array[j]<'0'){
break;
}
//这个时候已经遇到不是数字的字符了,就需要判断之前的数组有没有越界
//如果res等于214748364了并且最后一位数比7还大.
//那么它乘10之后,一定比intMax还要大,就越界了,需要返回intMax
//如果第一个符号是个‘-’,也是到最后return res*sign的时候才加上负号的,前面的一律当整数除理
//如果第一个符号是‘-’了,那么sign就会是-1,它要是还越界了就会走到下面的return里,返回最小的那个值
if(res>limit ||res==limit&&array[j]>'7'){
return sign==1? Integer.MAX_VALUE:Integer.MIN_VALUE;
}
//res没到一个数字就多一个位数,所以每次要成10,再加当前的字符-‘0’
res = res * 10 + (array[j] - '0');
}
//给结果带上+-号
return res*sign;
}
}
如果觉得不错的话,可以看看我的其他题解
怎么把i am a student逆置成student a am i?面试题逆置字符串讲解
什么?动态规划10行求出连续子数组的最大和 剑指offer-42讲解
剑指 Offer 39. 数组中出现次数超过一半的数字 简单易懂14行搞定 。人人皆可会
LeetCode 24:两两交换链表中的节点,1662. 检查两个字符串数组是否相等