LeetCode7. 整数反转
题目链接:https://leetcode-cn.com/problems/reverse-integer
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
题解:
为了解决溢出问题,我的思路是 判断反转后整数是否溢出。
但对于某些刚入坑且基础薄弱的同学来说,可能并不知道如何反转 。
如何反转:
1 . 先创建一个足够大的变量用于存储反转后的整数,如 long long res。
2 . 我们可以通过取模操作获得整数个位(也就是最后一位),本题中是 x % 10。
3 . 接下来只要把 “ x % 10 ” 放在 res 最后一位便可。本题中的做法:先将 res * 10,再与 “x % 10” 相加。
4 . 此时的 x 还是原来的 x,那么我们如何获取 x 的十位(倒数第二位)呢?本题的做法是 “x /= 10;” 。除以10之后,原来的十位变成之后的个位,原来的个位消失,后面只需将其放入循环便可,详见下一步。
5 . 重复以上操作,直到 x 变成 0 为止,因为有负数的存在,所以循环结束的条件为 x == 0。
如何判断:
首先我们需要知道,INT_MAX:int类型的最大值。INT_MIN:int类型的最小值。
当循环结束后,判断反转后的整数是否在 INT_MIN ~ INT_MAX 之间,若在,res不变;如果不在,则返回0。
具体实现过程如下:
class Solution {
public:
int reverse(int x) {
long long res = 0;
while(x != 0) {
res = res * 10 + x % 10;
x /= 10;
}
return (res > INT_MAX || res < INT_MIN) ? 0 : res; //括号内的“或”,只有两个都为真时,结果才是真。
// 也可以用这个方法,判断long long类型的 res 是否与 int 类型的相等
//return (int) (res) == res ? (int) (res) : 0;
}
};