先附上题目:
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
Note:
Assume we are dealing with an environment which could only hold integers within the 32-bit signed integer range. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
求解(C++版):
这道题看上去比较简单,但是需要注意的细节和情况的处理还是很多的。
(1) 注意负数
(2)注意10,100这类数字的反转
(3) 最容易忽视的一点,整型的溢出。(2333333339反转超int)
注意我们计算的过程中不需要另外存数字,直接计算就好。处理溢出我们先用long long储存,超int后直接返回0
其实我们发现,(1)和(2)都不需要特殊处理,在运算的过程中会自行处理。
class Solution {
public:
int reverse(int x) {
int maxx=0x7fffffff,minn=0x80000000;//int最大值和最小值
long long ans=0;
while(x)
{
ans=ans*10+x%10;
if(ans>maxx||ans<minn)//解决溢出(long long)
{
ans=0;
break;
}
x/=10;
}
return ans;
}
};
这里补充一个知识点:
它的溢出范围(32位有符号整数)是[-214748368,2147483647]
可以算一下 0x7FFFFFFF 是多少
每个十六进制数4bit,因此8位16进制是4个字节,刚好是一个int整型
F的二进制码为 1111
7的二进制码为 0111
这样一来,整个整数 0x7FFFFFFF 的二进制表示就是除了首位是 0,其余都是1
就是说,这是最大的整型数 int(因为第一位是符号位,0 表示他是正数)
用 INT_MAX 常量可以替代这个值。