二哥的 LeetCode 题解真的精辟——鲁迅(我没说)
题意
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例
输入:x = 123
输出:321
输入:x = -123
输出:-321
输入:x = 120
输出:21
输入:x = 0
输出:0
难度
中等
分析 1
看到这题,我的第一感觉就是把 32 位的整数看成是一个字符串,然后直接调用 StringBuilder 的 reverse 方法,这样就可以完成反转了,对吧,完全可行。
剩下需要做的,就是处理一下负数的情况,还有超出边界的情况。
class Solution {
public int reverse(int x) {
String reversed = new StringBuilder().append(Math.abs(x)).reverse().toString();
try {
// 如果原始整数为负数,则反转后的结果也应该是负数
int result = Integer.parseInt(reversed);
return (x < 0) ? result * -1 : result;
} catch (NumberFormatException e) {
// 捕获溢出异常并返回 0
return 0;
}
}
}
①、Math.abs()
方法可以获取一个数的绝对值,比如Math.abs(-123)
的结果就是123
。
②、然后用 StringBuilder 的 append 方法将正数添加到字符串序列中。
③、调用 reverse 方法将字符串反转。我在《二哥的 Java 进阶之路》里曾讲过 reverse 方法,没看过源码的球友可以回头看一眼。
int n = count - 1; // 字符序列的最后一个字符的索引
// 遍历字符串的前半部分,`(n-1) >> 1` 是 `(n-1) / 2` 的位运算表示,也就是字符串的前半部分的最后一个字符的索引。
for (int j = (n-1) >> 1; j >= 0; j--) {
int k = n - j; // 计算相对于 j 对称的字符的索引
char cj = value[j]; // 获取当前位置的字符
char ck = value[k]; // 获取对称位置的字符
value[j] = ck; // 交换字符
value[k] = cj; // 交换字符
}
这个翻转的方法其实非常巧妙,从字符串的两端开始交换,直到中间位置,比从头到尾或者从尾到头要快一倍。
④、最后调用 Integer 的 parseInt 方法将字符串转换成整数,如果超出边界,就会抛出 NumberFormatException 异常,我们通过 try-catch 捕获这个异常,然后返回 0。如果是负数,就将结果乘以 -1。
来看一下题解的效率:
还不错,那其实我们可以再优化一下,不调用 StringBuilder 的 reverse 方法,我们可以自己实现一个翻转的方法,把 reverse 方法的源码拿过来改一改就行了。
class Solution {
public int reverse(int x) {
String reversed = reverseString(String.valueOf(Math.abs(x)));
try {
// 如果原始整数为负数,则反转后的结果也应该是负数
int result = Integer.parseInt(reversed);
return (x
回复