力扣7:整数反转
力扣7:整数反转
- 题目
- 思路
- 代码
题目
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。
思路
这道题我们可以分成两部分来做,一是完成反转二是检测是否溢出。
我们先说第一部分,想要完成反转我们可以一位一位的插入数字,但是返回值和参数都是整数类型所以我们只能使用数学方法来完成插入。我们每次都让参数对10进行取模也就是得到最后一位数字number,再让返回值*10+number。这样就可以完成数学方法的插入了。
第二部分也是最关键的部分,如何判断是否溢出,2^31-1=2147483647。这是一个十位数字所以我们判断的关键也就是十位数字。我们先假设如果参数x就是2147483647,反转过来就是7463847412这明显是溢出了但是我想让大家思考一下,反转过来的数字y它的最后一位是多少?当然仅仅是在x为十位数字的时候,我们可以发现y的最后一位也就是x的首位它不就只有两个值吗1或者2,因为参数x也不能溢出啊。所以说是判断十个数字是否溢出其实我们只需要判断前九位是否溢出就可以。那么怎么判断是否溢出呢?也很简单,既然只需要判断前九位是否溢出我们直接判断y是不是小于INT_MAX/10不就可以了。对于负数也是一样的只需要判断y是不是大于INT_MIN/10即可。也就是说整个判断的条件就是INT_MIN/10<y<INT_MAX/10,只要y在这个范围内就算最后还要插入第十位数字我们也可以保证不会溢出因为第十位只能是1或者2。
代码
class Solution {
public:int reverse(int x) {int res = 0;while (x != 0) {// 提前判断下面给res插入数字后会不会溢出//判断前九位即可if (res < INT_MIN / 10 || res > INT_MAX / 10) {return 0;}int number = x % 10;x /= 10;res = res * 10 + number;}return res;}
};