【经典算法题】整数反转
Leetcode 0007 整数反转
题目描述:Leetcode 0007 整数反转
分析
-
本题的考点:数学。
-
每次取出
x
的最低位加到结果中即可,即如果结果存储在r
中的话, r = r × 10 + x % 10 r = r \times 10 + x \% 10 r=r×10+x%10,然后让 x / = 10 x/=10 x/=10,直到x
为0为止。 -
因为不能使用64位整数,所以我们需要考虑边界情况,因为反转后可能越界,存在两种越界情况:
(1)假设
int
的最大值为INT_MAX
,则当 r × 10 + x % 10 > I N T _ M A X r \times 10 + x \% 10 > INT\_MAX r×10+x%10>INT_MAX,即 r > I N T _ M A X − x % 10 10 r > \frac{INT\_MAX - x \%10}{10} r>10INT_MAX−x%10的话越界,返回0;(2)假设
int
的最小值为INT_MIN
,则当 r × 10 + x % 10 < I N T _ M I N r \times 10 + x \% 10 < INT\_MIN r×10+x%10<INT_MIN,即 r < I N T _ M I N − x % 10 10 r < \frac{INT\_MIN - x \%10}{10} r<10INT_MIN−x%10的话越界,返回0;
代码
- C++
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 * 10 + x % 10;
x /= 10;
}
return r;
}
};
- Java
class Solution {
public int reverse(int x) {
int r = 0;
while (x != 0) {
if (r > 0 && r > (Integer.MAX_VALUE - x % 10) / 10) return 0;
if (r < 0 && r < (Integer.MIN_VALUE - x % 10) / 10) return 0;
r = r * 10 + x % 10;
x /= 10;
}
return r;
}
}
- Python
class Solution:
def reverse(self, x: int) -> int:
r = 0
sign = 1 # 记录符号,统一转为正数处理
if x < 0:
sign = -1
x = -x
while x != 0:
r = r * 10 + x % 10
x //= 10
r *= sign
if sign == 1:
if r > pow(2, 31) - 1:
r = 0
else:
if r < -pow(2, 31):
r = 0
return r
时空复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),
n
为x
的长度。 -
空间复杂度: O ( n ) O(n) O(n),
n
为x
的长度。