翻转整数
来源
https://leetcode.com/problems/reverse-integer/
要求
把一个整数倒序输出。例如:
Example1: x = 123, return 321
Example2: x = -123, return -321
思路
假设 x = 3647
- 不考虑溢出的情况,先把
x
中的每一位的数字都依次记录到digits[n] = {7, 4, 6, 3}
,再利用digits[n]
中的数字转化成整数; - 但会出现的问题主要是溢出:
// 最大、最小整数是
static const int MAX_INT = (int)((unsigned)~0 >> 1); // 对 0 取反后右移一位
static const int MIN_INT = -(int)(unsigned)~0 >>1) - 1; // 负数多一个(存储时 0 占了个整数位)
2.1 在依次记录每个位上的数字时,会遇到溢出的情况,需要处理当位数达到与 MAX_INT / 10
相同时最后一位(x
中的最高位),特别是 x = MIN_INT
时,因此在判断时采用-abs(x) <= -decimal
;
while(-abs(x) <= -decimal && abs(decimal) < MAX_INT / 10){
digits[n++] = (x % decimal) / (decimal / 10); // 记录每一位的数,从后往前
decimal *= 10;
}
2.2 在把 digits[n]
中数字转化的成整数时也会有溢出情况,在加入高位数字时,要保证加入后不溢出。
实现代码
int reverse(int x) {
static const int MAX_INT = (int)((unsigned)~0 >> 1);
int n = 0;
int decimal = 10;
int digits[16] = {};
if(x > -10 && x < 10){
return x;
}
while(-abs(x) <= -decimal && abs(decimal) < MAX_INT / 10){
digits[n++] = (x % decimal) / (decimal / 10); // 记录每一位的数,从后往前
decimal *= 10;
}
// digits[n] = x / (decimal / 10);
int revx = x / (decimal / 10);
if(abs(revx) > 10)
{
digits[n++] = revx % 10;
revx /= 10;
}
decimal = 10;
while(n--){
if (abs(revx) < MAX_INT % 1000000000)
{
revx = digits[n] * decimal + revx;
decimal *= 10;
}
else
return 0;
}
return revx;
}