c++判断整数翻转溢出_LeetCode题解 整数反转

点击上方蓝字关注我,会有更多干货哦b382f6d20df09a0e740058d42846b6e8.png

下面开始今天的学习~

c25e389cb91641a85dc07fafd11e847b.png

f763051762a565e6befb0c4b04521a09.png

leetcode题解

7.整数反转

题目描述

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123输出: 321

示例 2:

输入: -123输出: -321

示例 3:

输入: 120输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

解题方案

这道题相对来说比较简单,主要有两点需要注意

1. 数字反转    

数字或者字符串的反转通常都可以使用push和pop操作进行,不同的是,对于字符串,在使用push/pop操作时,不可避免的需要使用额外的存储空间,大小等于字符串的大小;而对于数字,则可以使用数学方法进行,比如对于数字X

//pop操作pop = x % 10;x = x / 10;
//push操作ret = ret * 10 + pop;

这个操作也是很好理解的,就是不停的对10进行模运算,得到的就是最后一位,然后将上次循环得到的结果乘10(相当于十进制中左移一位),在加上本次循环得到的模结果。

2. 溢出判断

本题的溢出判断是比较容易忽略或者考虑情况不全的,这里先介绍一种普遍的做法。根据上面的push操作公式,我们知道,每次循环的结果都是ret = ret * 10 + pop;

如果ret=ret*10+pop导致溢出,那么一定有,ret>=INTMAX/10,这是因为程序里整数除法运算只保留整数部分,int32范围[-2147483648 2147483647], INTMAX/10 = 214748364,如果ret=214748364,那么ret*10不一定溢出(需要pop>7),如果ret>214748364,那么ret*10一定溢出,如果ret<214748364,那么ret*10一定不溢出    

同理,对于复数也是一样,需要注意的是,负数的最小值是-2147483648,个位是8.

额外多说一句,虽然不是重点,关于正负号的处理,因为代码中用负数除整数或取模,结果都是负数,比如-26/10=-2,-26%10=-6;

综合以上要点,代码就很容易写出来了

Java 实现

class Solution {    public int reverse(int x) {        int ret = 0;        while(x != 0) {            int pop = x % 10;            x = x/10;            if(ret > Integer.MAX_VALUE/10 || (ret == Integer.MAX_VALUE/10 && pop > 7)) return 0;            if(ret < Integer.MIN_VALUE/10 || (ret == Integer.MIN_VALUE/10 && pop < -8)) return 0;            ret = ret * 10 + pop;        }        return ret;    }}

MORE

还有人通过别的方式进行溢出判断或者躲开溢出,比如看到有人将ret设置成long型,保证不会溢出,循环完之后通过ret是否大于Integer.MAX判断是否溢出,该方法虽然更简洁且可以通过测试,代码也更简单,但是原理写明了只能存储32位有符号整形,所以这种方法不符合题意。

e94179cf89c84f6562ba78c203e6f227.png

本文作者:程序员的独孤九剑

声明:本文归作者版权所有,如需转载请联系。

85b4494d1872d01d014b8a33777e6e31.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值