leetcode-04-整数反转

题目就不讲了,猪脑子应该都能想出题目了。

处理的点:
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 然后(3
10+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;
    }
    //这里引用了头文件,非常棒的写法。

更多的是想说一说其中的补充:

  1. INT_MAX,INT_MIN数值大小
    因为int占4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31.C/C++中,所有超过该限值的数,都会出现溢出,出现warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型long long 占8字节64位。

  2. 关于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,这个的思想更加好,这是视频思路的链接

发布了16 篇原创文章 · 获赞 0 · 访问量 228

猜你喜欢

转载自blog.csdn.net/weixin_44110100/article/details/105478576