Hello 大家好,今天为大家带来leetcode第7道题——整数反转
作为刚刚开始刷leetcode的小白,笔者一定会用最“白话文”的方式来讲解题目(ps:高深的…我也理解不了,呜呜呜)
好了,话不多说,进入正题吧!!
题目如下:
本文有两种做法,分别是字符串处理和数学处理,因为笔者刚刚接触c++语言不久,暂时还不太懂c++的一些库函数,所以在这里笔者主要讲解数学处理的方法。
相信大家看到这道题,心中都会有很多思路,不就是整数反转嘛,简单!倒序输出就可以了呀,,,,,
笔者一开始就是这样想的,也是这样入坑的。。。。。
首先可以肯定的是,这样想没错,但是忽略了本题最大的陷阱,我们输出的数是有范围的!!!!!
在这里需要补充一个知识点,-2的31次方是- 2147483648,2的31次方-1是2147483647,如果知道这两个,这道题基本上成功一半了。
首先我们需要定义一个整型变量y用来存储整数反转后的数值,在while循环中,定义一个变量k来存储x%10的值。
由于程序中有y=y10+x%10;
注意这里,不能直接将y的值与- 2147483648和2147483647进行比较,因为假如y的值是2147483645,这时候y是符合我们程序中设置的范围的,但是等到下一步y10之后,y就会溢出,因此只能将y与214748364进行比较。
对于正界限2147483647:
如果y>214748364的话,那么经过y=y10+x%10,y的值会直接溢出,就返回0
如果y=214748364的话,如果k>7,那么经过y=y10+x%10,y的值依然会大于2147483647,也会产生溢出,返回0。
同理可得,对于负界限-2147483648:
如果y<-214748364的话,那么经过y=y10+x%10,y的值会直接溢出,就返回0
如果y=-214748364的话,如果k<-8,那么经过y=y10+x%10,y的值依然会小于-2147483648,也会产生溢出,返回0。
好了,本题的精髓部分,笔者应该已经讲述的比较完备了,如果有不理解的地方,欢迎在评论区与笔者讨论!!
代码:
class Solution {
public:
int reverse(int x) {
int y=0,k;
while(x!=0)
{
k=x%10;
if(y > 214748364||(y == 214748364&&k>7))
return 0;
if(y < -214748364||(y == -214748364&&k<-8))
return 0;
y=y*10+x%10;
x=x/10;
}
return y;
}
};