实现一个myAtoi(string s )函数,这个函数的作用是根据指定规则将输入的字符串转换为32位有符号整数。 (32位有符号整数就是int类型数据范围,最高位表示正负,其余31位表示数据范围,这个范围就是-2147483648~2147483647)
转换规则如下:
前导空格+正负符号位+数字
1.去除前导空格
2.读入下一个字符,如果是‘+’或者‘-’,对应输出的正负数。如果没有正负字符则跳过这一步检测
3.继续读取字符,如果是数字就读取,只要不是数字就中断读取。
4.如果输出的整数在[-2^31,2^31-1]范围外,需要截断这个整数,使其保持在这个范围内。
5.只能使用int类型去存储输出结果不可以使用long类型存储。
转换规则示例:
输入:“ 23”
输出:23
解析:去除前导空格,然后输出读取到的数字
输入:“ -42”
输出42
解析:去除前导空格,然后读取正负符号,并输出数字-42
输入:“23adfa12312”
解析:逐个读取时碰到字母a不是数字,中断读取,这个时候输出就是23
输出:23
输入:“1232546547658675”
输出:2147483647
解析:超出范围,输出最大范围2147483647
代码:
public static int myAtoi(String str){
char[] chars = str.toCharArray();
int len = str.length();
//定义指针逐个读取字符
int index = 0;
//规则1:去除前导空格
while (index<len){
if (chars[index]==' '){
index++;
}else {
break;
}
}
//防止用例是极端情况全是空格“ ”,所以这里直接返回
if (index==len){
return 0;
}
//定义sign用于标记正负
int sign = 1;
//规则2:判断正负
char firstChar = chars[index];
if (firstChar=='+'){
index++;
}else if (firstChar=='-'){
sign =-1;
index++;
}
//规则5:定义一个int类型数据用于存储输出结果
int res = 0;
while (index<len){
char c = chars[index];
//规则3:只要不是数字直接中断读取
if (c<'0'||c>'9'){
break;
}
//规则4:处理溢出问题
if (res>Integer.MAX_VALUE/10||res==Integer.MAX_VALUE/10&&Integer.MAX_VALUE%10<(c-'0')){
return Integer.MAX_VALUE;
}
if (res<Integer.MIN_VALUE/10||res==Integer.MIN_VALUE/10&&Integer.MIN_VALUE%10>-(c-'0')){
return Integer.MIN_VALUE;
}
//注意!这里要sing * (c-'0') 而不是 (c-'0')
res =res*10+sign*(c-'0');
index++;
}
return res;
}
溢出问题:
如果直res =res * 10 + sign *(c-'0'),可能会超出int的范围,会抛出异常。所以提前判断是否溢出。判断溢出分成两部分逻辑判断,一部分逻辑是直接 /10,判断res十位到最高位部分是否会溢出,另一部分逻辑是%10取余判断个位的数字是否会超出范围溢出。