leetcode 7 整数反转(C#)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/moon_goes/article/details/102572029

题目

给出一个 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/
这位大佬的图解每次都能帮我更好理解题意,推荐给大家。

猜你喜欢

转载自blog.csdn.net/moon_goes/article/details/102572029
今日推荐