不多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;
}
微信扫码查看本文
发表评论