【剑指 Offer 67】把字符串转换成整数
一、题目描述
1.题目描述
示例1:
输入: “42”
输出: 42
示例2:
输入: " -42"
输出: -42
示例3:
输入: “4193 with words”
输出: 4193
2.题目链接
把字符串转换成整数
二、解题报告
1.思路分析
若想遍历整个字符串,我们需要把字符串转化为字符数组。
在遍历的过程中,我们需要做几件事:
- 在遇到第一个数字之前需要过滤掉空格和判断正负号,若遍历过程中一直没遇到数字或者第一个遇到的是除了空格和正负号的字符,则返回0。所以我们需要一个
sign
变量来标记是正是负,需要一个flag
变量来标记是否已经遇到数字。 - 在遇到数字之后,我们需要把遍历到当前位时整数的值存储起来,直到遍历完数组或者遇到第一个不在0~9之间的字符。
- 在计算整数值的时候我们需要判断是否会溢出。判断方法为:以正数举例,在两种情况下会发生溢出,第一种,当
res > Integer.MAX_VALUE / 10
时,那么下次计算res
值的时候当res*10
的时候就会溢出,所以直接返回Integer.MAX_VALUE
。第二种:当res == Integer.MAX_VALUE / 10
时,是否溢出取决于tmp[i]
的值是否大于了Integer.MAX_VALUE % 10
即Integer.MAX_VALUE
的最后一位,若大于,则会发生溢出。
2.代码
我的代码如下(代码不够优雅)
class Solution { public int strToInt(String str) { char[] tmp = str.toCharArray(); boolean flag = true; int res = 0; int sign = 1; for(int i = 0;i < tmp.length;i++) { if(flag && (tmp[i] == ' ' || tmp[i] == '+' || tmp[i] == '-')) { if(tmp[i] == '+' || tmp[i] == '-') { flag = false; sign = tmp[i] == '+' ? 1:-1; } }else if(tmp[i] >= '0' && tmp[i] <= '9'){ flag = false; if(res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (tmp[i] - '0') > Integer.MAX_VALUE % 10)) return Integer.MAX_VALUE; if(res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (tmp[i] - '0') > -(Integer.MIN_VALUE % 10))) return Integer.MIN_VALUE; res = res*10 + (tmp[i] - '0')*sign; }else { break; } } return res; }}
三、总结
这题在做的时候卡在了溢出判断上面,好在最后看明白了,感谢广大互联网网友。