每日一道 LeetCode (2):整数反转

共 1448字,需浏览 3分钟

 ·

2020-07-30 19:09

题目:整数反转

题目来源:https://leetcode-cn.com/problems/reverse-integer

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31,  2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

解题思路

题目中对数字反转的结果有最大最小限制,这个限制实际上在 Java 中也是 int 类型的大小限制,把 [−2^31,  2^31 − 1] 这个公式计算一下,结果就是 [-2147483648, 2147483647] 。

接下来的就只剩下一个问题了,如何把一个整数进行反转。

我这里提供一个思路,我们对原数字除以 10 以后进行取模运算(取余数):

大体思路就是上面这样,然后注意边缘值判断,代码基本上就按照这个思路来:

public int reverse(int x) {
int res = 0;
while (x != 0) {
// 先获取末尾数字
int tmp = x % 10;

if (res < -214748364 || (res == -214748364 && tmp < -8)) {
return 0;
}

if (res > 214748364 || (res == 214748364 && tmp > 7)) {
return 0;
}

res = res * 10 + tmp;
x /= 10;
}
return res;
}

这种边界判断方式稍显笨重,我看了看别人的答案,看到一种溢出的判断思路,感觉不错分享下:

public int reverse_1(int x) {
int res = 0;
while (x != 0) {

if (res > 214748364 || res < -214748364) {
return 0;
}

res = res * 10 + x % 10;
x /= 10;
}
return res;
}

这个结果提交 LeetCode 以后,直接看到 LeetCode 说执行耗时超过 100% 的用户。

简直意外的惊喜,这里的判断极限值的含义如下:1463847412

极限最大值是 2147483648 ,除以 10 以后是 214748364 ,这里当 res 是 214748364 时,输入的 x 只能是 1463847412 ,因为 2463847412 、 3463847412 这些数字本身已经 int 溢出了。

思路非常巧妙,利用了 int 本身的溢出范围,限制了输入数据的大小,减少了需要判断的可能性。

感谢阅读



浏览 23
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报