LeetCode8. 字符串转换整数 (atoi)
题目描述
/**
* 请你来实现一个 myAtoi(string s) 函数,
* 使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
* <p>
* 函数 myAtoi(string s) 的算法如下:
* <p>
* 读入字符串并丢弃无用的前导空格
* 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。
* 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
* 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。
* 字符串的其余部分将被忽略。
* 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。
* 如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
* 如果整数数超过 32 位有符号整数范围 [?231, 231 ? 1] ,
* 需要截断这个整数,使其保持在这个范围内。
* 具体来说,小于 ?231 的整数应该被固定为 ?231 ,
* 大于 231 ? 1 的整数应该被固定为 231 ? 1 。
* 返回整数作为最终结果。
*/
思路分析
- 将字符串转为整数,实则为对一个字符串的处理
- 因为字符串可能包含前置空格,因此先要对字符串去前置空格的操作,可以使用字符串函数trim()或者使用一个while循环搞定
- 然后判断字符串的符号,如果不写,默认为正号,使用一个变量记录,正号为1,负号为-1
- 然后扫描剩下的字符串,到所有的字符串全部扫描完或者判断扫描到的字符不是数字为止
- 如果上述条件都不成立,则记录扫描到的数字
- 扫描结束后返回
- 源码见下
源码及分析
public int myAtoi(String s) {
//定义辅助变量
int res = 0, index = 0, sign = 1, len = s.length();
//去前置空格
while (index < len && s.charAt(index) == ‘ ‘){
index++;
}
//如果字符串全是空格,则返回零
if (index == len){
return 0;
}
//判断下一个符号是正还是负,如果不写默认为正
if (s.charAt(index) == ‘+‘){
index++;
}else if (s.charAt(index) == ‘-‘){
sign = -1;
index++;
}
//记录数字
while (index < len){
//取出当前位的字符并转成数字
int cur = s.charAt(index) - ‘0‘;
//判断当前位是否为数字
if (cur > 9 || cur < 0){
break;
}
//判断是否越最大值界
if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && cur > Integer.MAX_VALUE % 10)){
return Integer.MAX_VALUE;
}
//判断是否越最小值界
if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && cur > -1 * Integer.MIN_VALUE % 10)){
return Integer.MIN_VALUE;
}
//记录结果
res = res * 10 + cur * sign;
//索引+1
index++;
}
return res;
}
LeetCode8. 字符串转换整数 (atoi)