日期:20180912
题目描述:
Given a 32-bit signed integer, reverse digits of an integer.
Example 1:
Input: 123
Output: 321
Example 2:
Input: -123
Output: -321
Example 3:
Input: 120
Output: 21
详解:
这道题目乍一看很简单,但是'32-bit signed'正是出题人的陷阱,首先要考虑输出是否依然是在'32-bit signed'范围内,也就是[-231,231-1],也就是[-2147483648,2147483647],由题可知输入肯定是合法的,关键是反转后的输出是否合法,如果不合法按照题目的意思应该输出0。
class Solution {
public:
int reverse(int x) {
bool isNeg = false;
long long int y=0;
if(x<0){
isNeg = true;
x = -x;
}
while(x){
y = y*10 + x%10;
x /= 10;
}
if(y>2147483647||y<-2147483648)
return 0;
int tmp = y;
if(isNeg){
tmp = -tmp;
}
return tmp;
}
};
在此复习一下整数:
C类型 | 32位机器 | 64位机器 |
---|---|---|
char | 1字节 | 1字节 |
short int | 2字节 | 2字节 |
int | 4字节 | 4字节 |
long int | 4字节 | 8字节 |
long long int | 8字节 | 8字节 |
char* | 4字节 | 8字节 |
float | 4字节 | 4字节 |
double | 8字节 | 8字节 |
一开始用了long int,后来发现一点变化都没有,应该是因为编译器按32位编译的。使用了long long int之后就顺利通过了。
另外,计算机中储存数据使用补码,对于非负数:
补码 = 原码
对于负数:
补码 = 反码 + 1
例如对于4位int,-1的原码是1000 0000 0000 0000 0000 0000 0000 0001,反码是1111 1111 1111 1111 1111 1111 1111 1110,补码是 1111 1111 1111 1111 1111 1111 1111 1111。也就是0xFFFFFFFF。而-231的原码无法表示,根据连续性补码0x80000000的值就为-231。