难度
中等
题面:
请你来实现一个 myAtoi(string s)
函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi
函数)。
函数 myAtoi(string s)
的算法如下:
- 读入字符串并丢弃无用的前导空格
- 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
- 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
- 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
- 如果整数数超过 32 位有符号整数范围
[−2(31), 2(31 )− 1]
,需要截断这个整数,使其保持在这个范围内。具体来说,小于−2(31)
的整数应该被固定为−2(31)
,大于2(31 )− 1
的整数应该被固定为2(31 )− 1
。 - 返回整数作为最终结果。
注意:
- 本题中的空白字符只包括空格字符
' '
。 - 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
解题:
本体要求为仿照函数 myAtoi(string s) 实现功能:
由题可知,我们需要考虑到的一般情况有:
- 数字符号的判定
- 最终结果为整数
由题中的提示可知,我们需要考虑到的特殊情况有:
- “ -42”,在数字之前由空格
- “-8 123”,在第一个数字结束后,还有其它数字,此时值判断第一个数字
- “” \ “ ”,字符串为空或全部为空格
- “42 with words” \ “words with 42”,在数字之前或之后有空格和英文字母
- “975338364583215”,数字超出int类型范围(这里要注意,当考虑数字最终结果临界但不越界的情况)
代码:
public int myAtoi(String s) {
//1.将字符串转为字符数组,便于之后运算
char[] str = s.toCharArray();
//2.i为下标,num为结果
int i = 0,num = 0;
//当数组未到达尾部且当前下标所指字符为空格时跳过此字符
while (i < str.length && str[i] == ' ') {
i++;
}
//3.当处理完数组后数组为空数组时,返回0
if (str.length == i) {
return 0;
}
/*解决情况1、情况3*/
//4.结果的正负判定
//false:正
//true :负
boolean flag = false;
if (str[i] == '+' || str[i] == '-') {
flag = str[i++] == '-';
}
for (; i < str.length; i++) {
//5.当字符为数字时转为整数
if (str[i] <= '9' && str[i] >= '0') {
int ans = str[i] - '0';
//6.当结果到达上限或下限时,根据上面判定的正负返回整数上限或下限
/*解决情况5*/
if (num > (Integer.MAX_VALUE - ans) / 10) {
return flag ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
//7.算出结果的绝对值
num = num * 10 + (str[i]-'0');
} else {
//8.当数字部分结束时,结束循环
/*解决情况2、情况4*/
break;
}
}
//9.根据上面判定的结果,决定最终结果的正负
return (flag?-num : num);
}