不多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; }

微信扫码查看本文
发表评论