LeeCode——整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
可能是刚上手LeeCode,我这种小白一直以为提交完整代码,之后发现不太对劲,便根据参考答案调试。
刚开始我是这样写的
这里并没有注意溢出的情况,自然而然的发生了错误。
我为什么不判断溢出呢,因为我根本不会写啊!!!T^T
然后我想了想,加了判断溢出的条件 INT_MAX, INT_MIN,int的最大值和最小值。
最初执行是正确的。
但最后还是溢出了,错误和之前是一样的。 我实在忍无可忍,去看了答案。。。。。。。。。
。。。
。。
。
后续就是,我并没有看懂答案的溢出条件说明了什么,怎么来的我也不知道,所以我果然是个菜鸟。
。。。
。。
。
刚刚明白了这个溢出条件,
if( rev > INT_MAX/10 || (rev == INT_MAX/10 && pop>7)) return 0;
if( rev < INT_MIN/10 || (rev == INT_MIN/10 && pop<-8)) return 0;
答案的溢出条件是这样的,如果数在执行 rev = rev * 10 + pop; 这一句之前没有判断,那么在rev*10之前rev就已经发生溢出,因此当rev大于(小于)最大值(最小值)时溢出,并且当它的十位及高位未溢出时,个位在判断溢出后才加上,那么个位有可能发生溢出,Int的
2^31-1=2147483647 ,INT_MAX
-2^31=-2147483648 , INT_MIN
它的个位是7 和 -8,因此当加上的pop数大于7或者小于-8的时候,便会产生溢出,于是添加这个条件后,便成功通过。
但是它用时还是挺长的。。。内存消耗也长。。。。这就不是我一个小菜鸟现在能解决的问题了。。