有关整数反转的探讨

       关于这次文章的写与发布,这次我主要放两段代码,一段是我自己写的代码,有点拙劣不堪😅,下一段是官方的代码我把它拿过来解析了一下,其实这中间我也学习到了不少
       下面放的是写的代码,看到这题最初想到的一种解法,废话不多说,上代码!😎

public class SecondReverse {
    public static void main(String[] args) {
        int reverse = reverse(14236469);
        System.out.println(reverse);
    }

    public static int reverse(int x){
        long result=0;

        //将取出的数转为字符串方便后面操作
        String strnum=x+"";

        //超过上限判断
        if (x>Integer.MAX_VALUE||x<Integer.MIN_VALUE){
            //超过就打印一个0
            System.out.println(0);
        }else {
            //下面是反转操作
            char[] chars = strnum.toCharArray();
            strnum="";
            //是负数时进行判断手动增加-号,再进行反转累加
            if (x<0){
            	strnum+="-";
                for (int i=chars.length-1;i>=0;i--){
                    
                    if (i!=0){
                        strnum+=chars[i];
                    }
                }
            }else if (x>0){
            //正数时就进行反转累加
                for (int i=chars.length-1;i>=0;i--){
                    strnum+=chars[i];
                }
            }else {
                return  0;
            }
        }
        //这里注意!!!
        //防止反转超界,先转成long
        long l = Long.parseLong(strnum);
        //再进行判断若超出则返回0,不然强转返回反转的数
        if (l<Integer.MIN_VALUE||l>Integer.MAX_VALUE){
            return 0;
        }else {
            return (int) l;
        }
    }
}

是不是感觉很水😂,不过当时一分钟之内就想到这个解题思路,当时还是没有其他方法前提下用这个解的,毕竟先解出来最重要的,优化这事后期再改进

在这里插入图片描述

该说不说上述的写法主要思想就是先转字符数组再转回去,当然在同等算法下对内存消耗和机器性能要求要较高,下面的就是一种优化策略。

public class IntReverse {
    public static void main(String[] args) {
        int reverse = reverse(1561561651);
        System.out.println(reverse);
    }

    public static int reverse(int x){

        //这是定义一个反转的结果
        int result=0;
        while (x!=0){       //定义当传入的数不等于0就可以就下面运算
            int num=x%10;   //去到传入整数最后一位
            x/=10;          //将整个数缩小10倍,因为上述已经将最后一位各位数取到
            //下面就是超过上限或下限的判断
            if (result > Integer.MAX_VALUE/10 || (result == Integer.MAX_VALUE / 10 && num > 7)) return 0;
            if (result < Integer.MIN_VALUE/10 || (result == Integer.MIN_VALUE / 10 &&num < -8)) return 0;

            //这个就是反转的奥义所在,由后到前反过来乘出来
            result=result*10+num;
        }
        return result;
    }
}

在这里插入图片描述

在官方代码上加了注释为了更加便于理解。看吧,大佬的写法就是厉害,非常简洁明了,思路也很清晰,最重要的是中间的小算法。这其实就跟当初学设计环形队列的对头与队尾在添加时的索引号的所采用的小算法有相同的设计理念。

       其实这些设计很精巧,不可能说一下子就领悟透彻,都是一点一点慢慢的累积与尝试所呈现的。比如说你不知道整数取模拿出最后一位再前移这一思路,虽然说可以写出来但是会有点麻烦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发飙的恒星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值