【代码】LeetCode整数反转遇到的坑

2022-03-01 14:56:11  阅读 2620 次 评论 0 条

不多BB,直接进入正题,在反转整数的时候出现了结果是1056389758的返回值

相关地址:https://leetcode.com/problems/reverse-integer/

当时官方测试用例的参数是x=1534236469,然后期望值是0,而代码返回了res=1056389758

哦,对了,我当时代码是这么写的

public int Reverse(int x)
{
  int res = 0;
  while (x != 0)
  {
    res = (res * 10) + (x % 10);//把存储的数*10,空出最后一位给新添加的数,对10求余数,取最后一位
    x /= 10;//把最后一位干掉
  }

  return (res > int.MaxValue) || (res < int.MinValue) ? 0 : res;
}

然后。。。

不通过,这个判断他不好使。。。

猜测,964632435*10底层是10个964632435相加。

验证:

int result = 0;
for (int i = 0; i < 10; i++)
  result += 964632435;
Console.WriteLine(result);//1056389758

于是乎,骚操作来了(具体看注释)

下面那个判断是判断上一步算的结果,而964632435*10再加上1之后,已经被截断了,就得到了1056389758

1056389758/10已经不等于964632435了,所以可以认定溢出,直接返回0

往前推一位,此时,res的值是96463243,那么乘10以后得到的是964632430再加上此时x的值(15),对10求余之后,得到5  964632430+5=964632435

往下走,去验证,964632435/10=96463243(别问我那个.5哪去了,被int吃了)

此时,res在处理之前的值已经存在了lastl里面,和last比较。

通过,继续循环

//整数反转
public static int Reverse(int x)
{
  int res = 0;
  int last = 0;//用于存储临时验证的结果
  while (x != 0)
  {
    last = res;
    //把存储的数*10,空出最后一位给新添加的数。参数对10求余数,取最后一位,进行相加
    res = (res * 10) + (x % 10);
    
    if (res / 10 != last)//检查是否是来自上一步计算的结果
    {
      return 0;
    }
    x /= 10;//把最后一位干掉,也就是上面每一次相加都是他的最后一位,一步一步往前推
   }

  return res;           
}



微信扫码查看本文
本文地址:https://www.yangguangdream.com/?id=2196
版权声明:本文为原创文章,版权归 编辑君 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?