题目:
请你来实现一个 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 。
- 返回整数作为最终结果。
解题思路:
本题与前几篇blog中的题目相似,均为模拟类题,由于s的长度有可能为0,因此先进行边界判断,如果长度为0,直接返回数字0;
下来按照题目要求进行模拟即可:
1. 丢弃无用前导空格,我们用一个整形变量表示遍历索引,当遍历字符为‘ ’时,索引直接向前;
2. 检查正负符号,用一个整形变量记录正负,1表示正,-1表示负,方便结果的输出。初始值给定为1,表示如果没有符号,默认为正;
3. 遍历数字,并用一个整型变量res做累加,当遍历字符不在0-9的ascll码范围内时,结束遍历。
注意:
1. 模拟过程中,需要做索引越界判断;
2. 遍历过程中,需要做溢出判断,当做累加后的数字除以10不等于累加前的数字,那么该数字已经溢出。
代码示例:
public class MyAtoi {
public int myAtoi(String s) {
if (s.length() == 0) return 0;
char[] sChars = s.toCharArray();
int i = 0, res = 0;
int isMinus = 1;
while (i < s.length() && sChars[i] == ' ')
i++;
if (i < s.length() && (sChars[i] == '-' || sChars[i] == '+')) {
isMinus = sChars[i] == '+' ? 1 : -1;
i++;
}
while (i < s.length() && sChars[i] >= 48 && sChars[i] <= 57) {
int last = res;
res = res * 10 + (sChars[i] - 48);
if (res / 10 != last) return isMinus == -1 ? Integer.MIN_VALUE : Integer.MAX_VALUE;
i++;
}
return res * isMinus;
}
}