这篇帖子的背景是8. 字符串转换整数 (atoi)
在这道题中需要重写atoi,便需要考虑到整数发生溢出的情况
判断输入整数是否发生溢出我们知道,整数的范围是 [-2^31, 2^31 - 1],也就是 [-2147483648, 2147483647]
在这道题中,我们使用sign来判断数值的符号,value来记录数值的值,所以value为非负数
因此,我们只需要根据214748364进行讨论
// 根据ASCI得到该位置的数字
int num = c - '0';
// 判断是否会发生溢出
if(value == 214748364){
// 正数超过2147483647会发生溢出
if(num > 6 && (sign == 1 || sign == 0)){
return Integer.MAX_VALUE;
}
// 负数小于-2147483648会发生溢出
else if(num > 7 && sign == -1){
return Integer.MIN_VALUE;
}
}
// 值将大于等于2147483650,必发生溢出
else if(value > 214748364){
return (sign == 1 || sign == 0)?Integer.MAX_VALUE:Integer.MIN_VALUE;
}
下面附上这道题的整体思路和全部代码 整体思路
遍历字符串,根据不同的情况处理输出结果,处理数据。采用ASCI将输入的字符转换成数字,根据214748364的比较来判断是否发生溢出。
代码
class Solution {
public int myAtoi(String s) {
// 输入字符的长度
int l = s.length();
// 已经得到的数字位数
int digit = 0;
if(l == 0){
return 0;
}
else{
// 用于判断正负以及是否已经遍历'-'和'+'
int sign = 0;
// 目前得到的数字值
int value = 0;
for(int i = 0; i < l; i++){
// 获得在该位的字符
char c = s.charAt(i);
// 如果这个字符可以转换为数字
if(Character.isDigit(c)){
// 根据ASCI得到该位置的数字
int num = c - '0';
// 判断是否会发生溢出
if(value == 214748364){
// 正数超过2147483647会发生溢出
if(num > 6 && (sign == 1 || sign == 0)){
return Integer.MAX_VALUE;
}
// 负数小于-2147483648会发生溢出
else if(num > 7 && sign == -1){
return Integer.MIN_VALUE;
}
}
// 值将大于等于2147483650,必发生溢出
else if(value > 214748364){
return (sign == 1 || sign == 0) Integer.MAX_VALUE:Integer.MIN_VALUE;
}
// 更新value和digit
value = value*10 + num;
digit ++;
}
// 输出结果为负数
else if(c == '-' && sign == 0 && digit == 0){
sign = -1;
}
// 输出结果为正数
else if(c == '+' && sign == 0){
sign = 1;
}
// 前置空格
else if(c == ' ' && digit == 0 && sign == 0){
continue;
}
// 在数字中出现了空格
else if(c == ' ' && digit != 0){
break;
}
// 在正号后出现了空格
else if(c == ' ' && sign == 1){
break;
}
// 其他情况下出现了空格
else if(c != ' '){
break;
}
}
// 输出正数
if(sign == 0 || sign == 1){
return value;
}
// 输出非正数
else{
return sign*value;
}
}
}
}
有什么问题也欢迎在评论区讨论



