Leetcode整数反转算法与分析

@Leetcode整数反转

先看题干:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。
请根据这个假设,如果反转后整数溢出那么就返回 0。

输入: 123
输出: 321

输入: -123
输出: -321

输入: 120
输出: 21

每一位拿到整数反转这道题的小白coder,都会认为取模再乘以取模次数即可拿下本题,诚然这是本题的解题方法,但有很多的细节需要注意,代码精简性也是一大挑战。

本题的具体思路是:将要取得的数x模10得到其余数,再将其乘以10,然后加上x除以10后再次模10得到的余数,以此类推直到x等于0了为止,得到的ans就是所需要的解。这里需要注意while的条件是x本身,因为无论x的正负,都可以进行循环。具体的细节分析就让我们通过以下两个版本的代码来一起看看。

首先来看一下第一个版本:

class Solution {
public:
int reverse(int x) {
long ans=0;
    while (x!=0) {
        ans=ans*10+x%10;
        x/=10;
    }
    if (ans>2147483647||ans<-2147483648)
        ans=0;
    return (int)ans;
     }
};

在这里插入图片描述

这个版本中,判断溢出的操作在循环之外,当整个操作都结束了的时候会进行判断,此时若有溢出的情况再另执行。这种思路有一个好处,就是无需在循环过程中判断溢出,但不好的地方在于,如果已经出现了溢出,这个方法不能及时终止循环的判断,这会导致循环中会执行一些不必要的操作。

再来看看另一个版本:

class Solution {
public:
int reverse(int x) {
          long ans=0;
          while(x){
              long temp=(int)(ans*10)+x%10;
              if(temp/10!=ans)
                  return 0;
              ans=temp;
             x/=10;
         }
         return ans;
     }
};

在这里插入图片描述
这个版本与之前版本的很明显的不同点在于将溢出的判断放进了循环之中,通过检查ans与temp除以10之后的值是否相等来达到检查溢出的效果。二者执行起来消耗的区别并不大,但这种版本显然可以在溢出时避免一些没有必要的操作,可是它同样有缺点,那就是在循环之中的判断使得在无溢出时,该方法要比之前的版本多执行很多次的判断,可以说两个版本各有千秋,使用者可以按个人喜好选择。

另外,本题在编写上的细节处理非常重要,比如说在第一个版本最后输出的ans以及第二个版本中间判断溢出的ans一定要强制转化成int型进行判断,否则后台执行时会因为你超出了int的范围而报错,你会接到像下图那样的错误信息:在这里插入图片描述
在加上强制类型转换之后,问题便可以迎刃而解。注意使用long而不是int来定义变量是因为如果是溢出范围的变量,int型已经无法进行判断了,故其只能达到题目的一部分要求,这个点在本题编写的初期就应该想到。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值