1.题目
给你一个 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
提示:
- -231 <= x <= 231 – 1
2.答题
思路1:
- 用x取余,得到个位数,后用x取模,移除个位数,0位数*10+个位数
- 用x取余,得到十位数,后用x取模,移除十位数,个位数*10+十位数
- .
- .
- 直到x为0,完成
public class Solution {
public int reverse(int x) {
int res = 0;
while(x != 0) {
int mod = x % 10;
res = res * 10 + mod;
x /= 10;
}
return res;
}
}
复制代码
边界条件:如何判断反转后的整数是否超过32位有符号数,当循环到达最后一层时,即x<10&x>-10的时候,
-
若x为正数:
- x的前n-1位>MaxInt的前n-1位,会超出边界;
- x的前n-1位=MaxInt的前n-1位,x最后一位>MaxInt的最后一位,会超出边界
-
若x为负数:
- x的前n-1位<MinInt的前n-1位,会超出边界;
- x的前n-1位=MinInt的前n-1位,x最后一位<MinInt的最后一位,会超出边界
增加条件后的代码:
class Solution {
public int reverse(int x) {
int res = 0;
while(x != 0) {
if (x < 10 && x > -10) {
if (res > (Integer.MAX_VALUE / 10)) {
return 0;
}
if (res == (Integer.MAX_VALUE / 10) && x > (Integer.MAX_VALUE % 10)) {
return 0;
}
if (res < (Integer.MIN_VALUE / 10)) {
return 0;
}
if (res == (Integer.MIN_VALUE / 10) && x < (Integer.MIN_VALUE % 10)) {
return 0;
}
}
int mod = x % 10;
res = res * 10 + mod;
x /= 10;
}
return res;
}
}
复制代码
提交结果:
呃,边界值的判断有点多,总感觉不太优雅
思路2:
- 使用String存储x
- 倒序截取字符串,并存入新的字符串中
- 使用int的包类Integer,将字符串转行为Integer,利用Integer转换异常,处理最终结果超出范围的情况
代码实现如下:
class Solution {
public int reverse(int x) {
//防止负数出现“545454-”的情况
String xString = String.valueOf(Math.abs(x));
String targetString = new StringBuilder(xString).reverse().toString();
try {
int res = Integer.valueOf(targetString);
return x < 0 ? -res : res;
} catch (NumberFormatException exception) {
return 0;
}
}
}
复制代码
提交结果:
看代码是简化多了,但是两种思路的执行结果差距并不大,始终是干不过大神们啊。
本题暂时想到目前的两种方法,如有错误,请大家指出,如有其它解法,可以留言分享一下,谢谢阅读。
目前解题没有按顺序来,先找简单的题开始解,毕竟挑软柿子捏嘛。。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END