力扣7. 整数反转

方法一:官方给的,自己懂了后照着敲了一遍

class Solution {
    public int reverse(int x) {
        int rev = 0;
        while (x != 0) {
        //if判断条件过于复杂,我好不容易看懂了
            if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {
                return 0;
            }
            int digit = x % 10;
            x /= 10;
            rev = rev * 10 + digit;
        }
        return rev;
    }
}

1.收获也有,
Java中整型最大值和最小值用两个变量表示:
在这里插入图片描述
在这里插入图片描述
2.在JDK中,整形类型是有范围的,最大值为Integer.MAX_VALUE,即2147483647,最小值为Integer.MIN_VALUE -2147483648。
对整形最大值加1,2147483648(越界了),那么此时值为多少呢?结果是-2147483648,即是Integer.MIN_VALUE。
类似的,对Integer.MIN_VALUE取反或者取绝对值呢?仍为Integer.MIN_VALUE,因为值为-2147483648,绝对值2147483648超过Integer.MAX_VALUE 2147483647。
所以就有以下结果
Integer.MAX_VALUE + 1 = Integer.MIN_VALUE
Math.abs(Integer.MIN_VALUE) = Integer.MIN_VALUE (绝对值)
Long,short,byte的结论是相同的。
转自:https://blog.csdn.net/qq_39590763/article/details/85764780
讲的太清楚了,希望原作者原谅我“直接参考”

方法二:力扣评论区网友的,比较好理解

class Solution {
    public int reverse(int x) {
        int rev = 0;
        int temp = 0;
        while(x!=0){
            temp = rev*10+x%10;
            if(temp/10!=rev){//溢出
                return 0;
            }
            rev = temp;
            x/=10;
        }
        return rev;
    }
}

1.if(temp/10!=rev)怎么就溢出了呢?
因为超过范围后部分数据会被抹去,这时在除以10也不能回到上一次循环,也就表示溢出了
2.这种方法比较野,不是“正派”解法,只适用于 溢出时编译器不报错 的语言,Java就是其一

再看看错误代码:
我第一次写的代码

class Solution {
    public int reverse(int x) {
        boolean flag = x>=0?false:true;//区分x正负
        if(flag){
            x=-x;
        }
        int rev = 0;
         while(x/10!=0){
            rev = rev*10+x%10;
            x /= 10;
        }
        rev = rev*10+x%10;
        if(flag){
            rev = -rev;
        }
        //判断rev是否在32位范围内
        if(rev>=Integer.MIN_VALUE&&rev<=Integer.MAX_VALUE){
            return rev;
        }
        else{
            return 0;
        }
    }
}

1.首先没分清求余和取模的概念,根本没必要用标志变量flag区分x的正负
2.没理解题目的要求:整数超过 32 位的有符号整数的范围就return 0;因为超过的数根本不会正确表示出来,所以代码

if(rev>=Integer.MIN_VALUE&&rev<=Integer.MAX_VALUE){
            return rev;
        }
        else{
            return 0;
        }

无用,我后来明白后想笑
3.可以优化while代码段

while(x!=0){
	rev = rev *10 + x%10;
	x/=10;
}

只是简单水平的题都能挖出这么多知识(我经常被菜醒)
生活充满希望!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值