【题目描述】
【原题链接】. - 力扣(LeetCode)
给你一个 32 位的有符号整数
x
,返回将x
中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围
假设环境不允许存储 64 位整数(有符号或无符号)。[−231, 231 − 1]
,就返回 0。示例 1:
输入:x = 123 输出:321示例 2:
输入:x = -123 输出:-321示例 3:
输入:x = 120 输出:21示例 4:
输入:x = 0 输出:0提示:
-231 <= x <= 231 - 1
【解题代码】
package number;
import java.util.ArrayList;
import java.util.List;
public class Reverse {
public static void main(String[] args) {
int x = 15340;
System.out.println(reverse(x));
}
private static int reverse(int x) {
if (x < -Integer.MAX_VALUE || x > Integer.MAX_VALUE) return 0;
int m = x;
int n;
List<Integer> reverseNumbers = new ArrayList<>();
while (m != 0) {
n = m - (m / 10) * 10;
if (reverseNumbers.size() > 0 || n != 0) {
reverseNumbers.add(n);
}
m = m / 10;
}
long i = 1;
long result = 0;
long tmp ;
for (int j = reverseNumbers.size() - 1; j >= 0; j--) {
tmp = i * reverseNumbers.get(j);
result += tmp;
if (result < -Integer.MAX_VALUE || result > Integer.MAX_VALUE) return 0;
i *= 10;
}
return (int)result;
}
}
【解题思路】
这道题我这次采用最简单的思路,就是通过反复除以10以及乘以10,依次取整数最后的数值,加到链表中,然后将链表中的数字依次取出乘以10相加
【解题步骤】
- 定义临时变量m,初始值为输入整数,当前数值m尾数字,存放所有数字的链表等变量;
int m = x; int n; List<Integer> reverseNumbers = new ArrayList<>();
- 当m>0,不断对m取尾部数值,并放入链表中,并将m不断除以10
while (m != 0) { n = m - (m / 10) * 10; if (reverseNumbers.size() > 0 || n != 0) { reverseNumbers.add(n); } m = m / 10; }
- 将链表中数字依次倒序取出,并不断乘10相加
for (int j = reverseNumbers.size() - 1; j >= 0; j--) { tmp = i * reverseNumbers.get(j); result += tmp; if (result < -Integer.MAX_VALUE || result > Integer.MAX_VALUE) return 0; i *= 10; }
-
最后返回计算结果
return (int)result;
【思考总结】
- 这道题解法比较简单,就是按十进制左右移位计算当前数据尾数值,并通过不断除以10,来获取整数所有数值;
- 稍微需要注意一点就是,整数最后连续的0也就是翻转过来的最高位是0的数字丢弃掉:
- LeetCode解题之前,一定不要看题解,看了就“破功”了!