题目链接
题目描述
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
- − 2 31 < = x < = 2 31 − 1 -2^{31} <= x <= 2^{31} - 1 −231<=x<=231−1
解题思路
模拟法
将数字转换成字符数组,然后进行反转,之后判断在不在范围内,需要注意末尾0和负号的处理方式
数学法
同时考虑到负数,循环的终止条件是x != 0
,因为无论是正数还是负数,按照上面不断的/10
操作,最后都会变成0
.同时也不会担心末位是0在翻转时出现错误。最终直接比较一下翻转后的数字在不在int
类型范围内即可
AC代码
数学法
class Solution {
public int reverse(int x) {
long ans = 0;
while (x != 0) {
long tmp = x % 10;
ans = ans * 10 + tmp;
x /= 10;
}
int max = Integer.MAX_VALUE;
int min = Integer.MIN_VALUE;
if (min <= ans && ans <= max) {
return (int) ans;
} else {
return 0;
}
}
}
字符串模拟法
class Solution {
public int reverse(int x) {
char[] num = String.valueOf(x).toCharArray();
StringBuilder ans = new StringBuilder();
if (num.length == 1) {
return x;
}
if (num[0] == '-' && num.length == 2) {
return x;
}
if (num[0] == '-') {
ans.append('-');
if (num[num.length - 1] == '0') {
for (int i = num.length - 2; i > 0; i--) {
ans.append(num[i]);
}
} else {
for (int i = num.length - 1; i > 0; i--) {
ans.append(num[i]);
}
}
} else {
if (num[num.length - 1] == '0') {
for (int i = num.length - 2; i >= 0; i--) {
ans.append(num[i]);
}
} else {
for (int i = num.length - 1; i >= 0; i--) {
ans.append(num[i]);
}
}
}
long res = Long.parseLong(ans.toString());
int max = Integer.MAX_VALUE;
int min = Integer.MIN_VALUE;
if (min <= res && res <= max) {
return (int) res;
} else {
return 0;
}
}
}