leetcode-把字符串转换成整数 题目链接:题目传送门 题目的大意就是,有一个字符串,要将其中存在的数字部分挑拣出来,转化成一个数字,类似于Integer.parse()函数,但是他有几个有趣的地方,输入的字符串可能含有非数字的部分,要进行筛选,而且输入的结果可能会超出int界限,如果超出了,则根据正负号返回对应int最大值或者int最小值 其实还是不难的,只不过样例而新一些,不过在观摩大佬的题解以后,发现了一些有趣的时,先看代码
public int strToInt(String str) {
str = str.trim();
char[] chs = str.toCharArray();
if(((str.length()>0))&&((chs[0]=='+')||(chs[0]=='-')||((chs[0]>='0')&&(chs[0]<='9')))) {
int num = 0, sign = 1;
if((chs[0]>='0')&&(chs[0]<='9')) num = chs[0] - '0';
if(chs[0]=='-') sign = -1;
int size = Integer.MAX_VALUE / 10;
int index = 1;
while((index<chs.length)&&((chs[index]>='0')&&(chs[index]<='9'))) {
if((num > size) || ((num == size)&&(chs[index]>'7'))) {
return sign==1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
num = (num*10) + (chs[index]-'0');
index++;
}
return sign*num;
}else{
return 0;
}
}
为了避免数据越界,我之前写的代码,使用了Long来存储最终的结果,但是long也是有界限的,所以说判断越界的代码,需要在拼接的过程中判断,那怎么判断呢?直接判断每一次的累加结果,K神大佬的思路就比较优雅了,先把Integer.MAX_VALUE/10得到一个size,在每次累加当前位的数字之前比较当前值num>=size,
- 如果大于,再加上新的一位,最后的结果肯定超范围。
- 如果等于的话,下一位结果如果加上了一个大于7的值,如果是正数,这时候已经越界了,返回最大值即可,如果是负数,理论上可能没有越界因为-2147483648就是最小值,但不论是不是8最后的结果都应该返回最小值
不得不说这个边界处理确实很秀,虽然有点反常规
|