题目就不讲了,猪脑子应该都能想出题目了。
处理的点:
1.负号要转正去判断
2.overflow
因为int表示的最大数是2^31-1=2 147 483 647,但是如果我就要表示 6463847412显然大于2 147 483 647。所以要注意一个判断
3.依次从位开始取,个–>十–>百
比如:
123
①:123%10=3,然后12%10=2。310+2
②:1%10=1 然后(310+2)*10
贴一贴C语言的代码:
int reverse(int x){
//123 t=123
long i=0;
long t=x;
while(t){
i=10*i+(t%10);
t=t/10;
}
if(i<INT_MIN||i>INT_MAX)
{
return 0;
}
return i;
}
注意:
if(i<INT_MIN||i>INT_MAX)
{
return 0;
}
//这里引用了头文件,非常棒的写法。
更多的是想说一说其中的补充:
-
INT_MAX,INT_MIN数值大小
因为int占4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31.C/C++中,所有超过该限值的数,都会出现溢出,出现warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型long long 占8字节64位。 -
关于INT_MAX INT_MIN的运算
由于二进制编码按原码、补码和反码的规则进行运算,所有程序中对INT_MAX和INT_MIN的运算应当格外注意,在出现溢出的时候,不遵循数学规则。
INT_MAX + 1 = INT_MIN
INT_MIN - 1 = INT_MAX
abs(INT_MIN) = INT_MIN
比较有趣的是,INT_MAX + 1 < INT_MAX, INT_MIN - 1 > INT_MIN, abs(INT_MIN) < 0.
扫描二维码关注公众号,回复:
11109598 查看本文章
底下是java的写法:
再讲解一下overflow的另一种判断
class Solution {
public int reverse(int x) {
int rev=0;//rev就是我们最终求得的结果
while(x!=0){
int newrev=10*rev+x%10;
//检查overflow操作
if((newrev-x%10)/10!=rev){
return 0;
}
rev=newrev;
x/=10;
}
return rev;
}
}
非常耗费内存,后期我会更正代码,优化一下。
谢谢篮子王basketwang的java思路,相对于C,这个的思想更加好,这是视频思路的链接