leetcode 7 整数反转(C#)

题目

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值