yxc题解
算法
(循环) $O(logn)$
依次从右往左计算出每位数字,然后逆序累加在一个整数中。
另外,这题有两点需要注意:
因为int型整数逆序后可能会溢出,所以我们要用long long记录中间结果;
在C++中,负数的取模运算和数学意义上的取模运算不同,结果还是负数,比如 −12%10=−2,所以我们不需要对负数进行额外处理。
时间复杂度分析:一共有 O(logn) 位,对于每一位的计算量是常数级的,所以总时间复杂度是 $O(logn)$.
使用long long
class Solution {
public:
int reverse(int x) {
long long r = 0;
// 这个while循环将 1234或 -1234 变成 4321 或 -4321 ---------秦九韶算法
while (x) {
r = r * 10 + x % 10;
x /= 10;
}
if (r > INT_MAX) return 0;
if (r < INT_MIN) return 0;
return r;
}
};
使用 int
class Solution {
public:
int reverse(int x) {
int r = 0;
while (x) {
if (r > 0 && r > (INT_MAX - x % 10) / 10) return 0; //这里用减法避免存储和判断时溢出
if (r < 0 && r < (INT_MIN - x % 10) / 10) return 0; //r是负数时,r-x%10,相当于一个负数加了正数,所以不会溢出
r = r * 10 + x % 10;
x /= 10;
}
return r;
}
};