哪些网站做的好处,延吉网站建设多少钱,东营房产信息网,wordpress阿里云图片不显示LCR 192. 把字符串转换成整数 (atoi) - 力扣#xff08;LeetCode#xff09; 我们以力扣的此题目为例#xff0c;简述在诸如大数运算等问题中如何限制数字溢出问题。 先来直接看看自己的处理方式#xff1a;
class Solution {
public:int myAtoi(string str) {int pcur0;…LCR 192. 把字符串转换成整数 (atoi) - 力扣LeetCode 我们以力扣的此题目为例简述在诸如大数运算等问题中如何限制数字溢出问题。 先来直接看看自己的处理方式
class Solution {
public:int myAtoi(string str) {int pcur0;int flag0;if(str.size()0) return 0;while(str[pcur] ||str[pcur]-||str[pcur]){if(str[pcur]-||str[pcur]) {if(str[pcur]-)flag1;//找到负数标志pcur;break;} pcur;}if(!isdigit(str[pcur])) return 0;long ans0;long ans10;while( pcur!string::npos str[pcur]9 str[pcur]0){ans1(str[pcur]-0ans*10);if(ans1INT_MAX){ansINT_MAX;break;}ans(int)ans1;pcur;}if(flag){if(ansINT_MAX ans1 ! INT_MAX) ans-ans-1;else ans-ans;};return ans;}
}; 题目前置的转换空格与正负号等都不是主要问题。由于计算机对于有符号整形的储存特点INT_MIN是-2147483648(2^31) 而INT_MAX是2147483647(2^31-1)原来使用的是一个ans1提前帮助ans探路是否超过INT_MAX 或者INT_MIN但是最终代码较为冗余。我们看看该如何控制最后的这段判断是否溢出的逻辑 1.我们直接把界限设在INT_MAX/10的位置上
int border INT_MAX / 10; // 用来验证计算结果是否溢出int范围的数据
while (i str.size())
{// 遇到非数字字符则返回已经计算的res结果if (str[i] 0 || str[i] 9)break;// 注意这句话要放在字符转换前因为需要验证的位数比实际值的位数要少一位, 这里比较巧妙的地方在于// 1. 用低于int型数据长度一位的数据border判断了超过int型数据长度的值 // 2. 将超过最大值和低于最小值的情况都包括了if (res border || res border str[i] 7)return sign true ? INT_MAX : INT_MIN;//开始对数字字符进行转换num str[i] - 0;res res * 10 num;i;
2.然后正常判断是否需要跳出
3.最关键的一步 if (res border || res border str[i] 7)return sign true ? INT_MAX : INT_MIN; 因为我们提前了一位border,所以在将新的一位数字加在我们原本数字的基础前已经比border大的再加一位一定是溢出已经等于214748364的下一位是8或者9的也可以直接在下一步取溢出值。这样就避免了真的去计算可能溢出的值而导致混乱。这种方法的精髓就是并没有真正去计算在溢出边缘的这一位会如何如何而是提前根据范围判断出是否溢出减少麻烦。