题目描述
给定一个int
型整数,请将各位数字反转。
如果结果大于INT_MAX
或小于INT_MIN
,请返回0.
注意:
- 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 $[−2^{31}, 2^{31} − 1]$。请根据这个假设,如果反转后整数溢出那么就返回 0。
样例1
输入: 123
输出: 321
样例2
输入:-123
输出:-321
样例3
输入:120
输出:21
算法
(循环) $O(log n)$
依次从右往左计算出每位数字,然后逆序累加在一个整数中。
另外,这题有两点需要注意:
- 因为int型整数逆序后可能会溢出,所以我们要用long long记录中间结果;
- 在C++中,负数的取模运算和数学意义上的取模运算不同,结果还是负数,比如 $-12 \% 10 = -2$,所以我们不需要对负数进行额外处理。
时间复杂度分析:一共有 $O(log n)$ 位,对于每一位的计算量是常数级的,所以总时间复杂度是 $O(log n)$.
C++ 代码
class Solution {
public:
int reverse(int x) {
int res = 0;
while (x) {
if (x > 0 && res > (INT_MAX - x % 10) / 10) return 0;
if (x < 0 && res < (INT_MIN - x % 10) / 10) return 0;
res = res * 10 + x % 10;
x /= 10;
}
return res;
}
};
想请教一下,res > (INT_MAX - x % 10) / 10中的/号不会丢失精度吗?
这样也能过。。
我在想 long int 和 int 不是一样的吗?
天秀
Y总
res > (INT_MAX - x % 10) / 10
这句是什么意思呢判断
res = res * 10 + x % 10
是否溢出。请问 y总为什么这么判断啊
本身计算res * 10 + x % 10就容易溢出,所以变成除法就能避免
它不是溢出了就return 0吗?
int占4个字节,一共32位,范围是-2147483648 ~ 2147483647。如果超出这个范围,就会加上或减去4294967296,使得值还落在这个范围内。溢出了就会被截断,你就无法判断是否已经溢出,导致程序发生错误。
题目好像有要求:
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
代码已更新。应该是后面lc新加了这个限制。
@yxc 是“$O(1)$”吗?
我想是$O(logn)$吧。
是的,已修正。
“时间复杂度分析:一共有 O(logn) 位,对于每一位的计算量是常数级的,所以总时间复杂度是 O(logn”
这个 一共有 O(logn) 位 怎么得出来的,绕不过弯来
比如数字n=100,那他的数字长度与 log_{10} 100 有关。本题中更关心的是数x,对应的数字长度
好的 谢谢哦 数字的长度这就明白了
对滴。