题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2 ^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解题:
解法一:ToString
反转首先让我想到Reverse这个方法,但是这个方法是string的,int并没有reverse的方法,于是把int转为string,再反转。由于题目还涉及到了数值范围,要用string判断数值范围,显然又要转回int。这样操作下来十分麻烦,显然不是合适的解法。
解法二:比较法。
一般我们要把数值限定在一个范围内,是直接比较这个数和最大值、最小值,但是这题还会有溢出的情况,所以不能直接比较。
我们要做的是设置一个int值 ans 存储答案、一个int值 pop 存储按位取的值。从原数值的个位开始取值,并赋给pop,如果ans未超过最大值或小于最小值,就继续取十位,直到取反完成。
当 ans > int.MaxValue / 10,如果还有一位数要添加(即大于最大值),那么溢出;当ans == int.MaxValue / 10 时, pop > 7(7是 最大值的个位)溢出。
当 ans < int.MinValue / 10时,还有一位数要添加(即小于最小值),那么溢出;当ans == int.MaxValue / 10 时,pop < -8(8是最小值)溢出。
public int Reverse(int x) {
int ans = 0;
while (x != 0)
{
int pop = x % 10;
if (ans > int.MaxValue / 10 || (ans == int.MaxValue / 10 && pop > 7))
return 0;
if (ans < int.MinValue / 10 || (ans == int.MinValue / 10 && pop < -8))
return 0;
ans = ans * 10 + pop;
x /= 10;
}
return ans;
}
参考:https://leetcode-cn.com/problems/reverse-integer/solution/hua-jie-suan-fa-7-zheng-shu-fan-zhuan-by-guanpengc/
这位大佬的图解每次都能帮我更好理解题意,推荐给大家。