题目描述
解题思路
本题定义为简单,那么应该用不到什么高大上的数据结构,其实就是考大家对 %
和 /
的使用,以及对整数边界的判别。
%
:取余,例如:11 % 10 = 1
,取尾/
:除以并取整,例如:11 / 10 = 10
,去尾- 两个搭配使用,就可以达到将一个数,从后往前依次取出每个数字,正好用于本题
- 因为整数的最大值为:
2147483647
,最小值为:-2147483648
- 如果一个数
大于214748364
,那么下一步rev = rev*10+pop
一定越界;或者一个数等于214748364
,并且pop > 7
,那么下一步rev = rev*10 + pop
也一定越界 - 如果一个数小于
-214748364
,那么下一步rev = rev*10+pop
一定越界;或者一个数等于-214748364
,并且pop < -7
,那么下一步rev = rev*10 + pop
也一定越界
Java
代码
class Solution {
public static int reverse(int x) {
int rev = 0; //用于存储反转后的数
while( x != 0){
int pop = x % 10; //pop表示取出整数的最后一个数
//因为整数的最大值为:2147483647,最小值为:-2147483648
//如果一个数大于214748364,那么下一步rev = rev*10 一定越界;
//或者一个数等于214748364,并且pop > 7,那么下一步rev = rev*10 + pop也一定越界
//如果一个数小于-214748364,那么下一步rev = rev*10 一定越界;
//或者一个数等于-214748364,并且pop < -7,那么下一步rev = rev*10 + pop也一定越界
if((rev > Integer.MAX_VALUE / 10||(rev == Integer.MAX_VALUE/10 && pop > 7))
||rev < Integer.MIN_VALUE / 10||(rev == Integer.MIN_VALUE/10 && pop <-8)){
return 0;
}
rev = rev*10 + pop; //把pop防到rev后面
x /= 10; //去掉整数的最后一个数,继续遍历
}
return rev;
}
}
Python3
代码
class Solution:
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
num = 0
if x == 0:
return 0
if x < 0:
x = -x
while x != 0:
num = num * 10 + x % 10
x = x // 10
num = -num
else:
while x != 0:
num = num * 10 + x % 10
x = x // 10
if num > pow(2,31)-1 or num < pow(-2,31):
return 0
return num
注意:
11 % 10 = 1,-11 % 10 = 9
11 // 10 = 1, -11 // 10 = -2
11 / 10 = 1.1,-11 / 10 =-1.1
python对正数和负数的结果不一样,我们应该将负数转为正数再操作
C++
代码
class Solution {
public:
int reverse(int x) {
int rev = 0; //用于存储反转后的数
while( x != 0){
int pop = x % 10; //pop表示取出整数的最后一个数
//因为整数的最大值为:2147483647,最小值为:-2147483648
//如果一个数大于214748364,那么下一步rev = rev*10 一定越界;
//或者一个数等于214748364,并且pop > 7,那么下一步rev = rev*10 + pop也一定越界
//如果一个数小于-214748364,那么下一步rev = rev*10 一定越界;
//或者一个数等于-214748364,并且pop < -7,那么下一步rev = rev*10 + pop也一定越界
if((rev > INT_MAX / 10||(rev == INT_MAX/10 && pop > 7))
||rev < INT_MIN / 10||(rev == INT_MIN && pop <-8)){
return 0;
}
rev = rev*10 + pop; //把pop防到rev后面
x /= 10; //去掉整数的最后一个数,继续遍历
}
return rev;
}
};