题目中明确提出了要考虑越界的问题,首先记录一下各个数据类型的取值范围:
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;
}