7. Reverse Integer

来源:互联网 发布:成都算法工程师招聘网 编辑:程序博客网 时间:2024/06/05 20:59

这里写图片描述
题目中明确提出了要考虑越界的问题,首先记录一下各个数据类型的取值范围:
int: 4byte = 32 bit 有符号signed范围:2^31-1 ~ -2^31即:2147483647 ~ -2147483648无符号unsigned范围:2^32-1 ~ 0即:4294967295 ~ 0

unsigned int 0~4294967295
int -2147483648~2147483647
unsigned long 0~4294967295
long -2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161

__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615

本题中的难点就是如何确定越界的问题:
代码如下:

class Solution {public:    int reverse(int x) {        int result = 0;        if(overflow(x))            return 0;        while(x != 0){            result = result*10 + x%10;            x /= 10;        }        return result;    }    bool overflow(int x){          if (x / 1000000000 == 0){              return false;          }else if (x == INT_MIN){              return true;          }           x = abs(x);          for (int cmp = 463847412; cmp != 0; cmp/=10, x/=10){              if ( x%10 > cmp%10 ){                  return true;              }else if (x%10 < cmp%10){                  return false;              }          }          return false;      }  };

现在来分析判断overflow的代码:
首先除以1000000000判断是否为10位数,不是10位数就肯定越界了;
然后判断是否为-2147483648,如果是,则越界。(该数需要单独判断)
最后取x的绝对值,让x从末尾与**边界前9位的反转**463847412比较。(因为如果x不越界的话,最高位肯定不是1就是2了)

bool overflow(int x){          if (x / 1000000000 == 0){              return false;          }else if (x == INT_MIN){              return true;          }           x = abs(x);          for (int cmp = 463847412; cmp != 0; cmp/=10, x/=10){              if ( x%10 > cmp%10 ){                  return true;              }else if (x%10 < cmp%10){                  return false;              }          }          return false;      }  
0 0