算法√ <整数反转(考虑整数的边界问题)>

算法√ <整数反转(考虑整数的边界问题)>

package hankaifeiCode;

/**
 * 题目7:整数反转(考虑整数的边界问题)
 * 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
 *
     * 注意:
     *
     * 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。
     * 请根据这个假设,如果反转后整数溢出那么就返回 0。
     *  
     *
     * 示例 1:
     *
     * 输入:x = 123
     * 输出:321
     * 示例 2:
     *
     * 输入:x = -123
     * 输出:-321
     * 示例 3:
     *
     * 输入:x = 120
     * 输出:21
     * 示例 4:
     *
     * 输入:x = 0
     * 输出:0
     *  
     *
     * 提示:
     *
     * -231 <= x <= 231 - 1
     *
     *
 */
/*
    思路:特殊情况:0 处理(判断如果等于0,则直接返回结果)
          接下来判断正整数是否超出了范围()
 */

public class lc7 {

    //不足一:没考虑数据越界的情况
    public static int reverse1(int mun) {
        int rev = 0;                 //初始值(数据交换的中间值)
        while (mun != 0) {           //结束条件是mun等于0
            int pop = mun % 10;     //求余数
            mun /= 10;               //对原数取整
            rev = rev*10 + pop;      //先将原数成10,再将余数相加
        }
        return rev;
    }

    //将数据越界的情况考虑进去
    public static int reverse2(int x) {
        //定义一个初始值(数据交换的中间值)
        int rev= 0;
        //while循环的结束条件是(原数据等于0)
        while (x != 0 ) {
            int pop = x % 10;
            x /= 10;
            //如果中间值大于integer最大值对10取整的,那么加上余数后肯定大于integer的最大值。
            //为啥要   Integer.MAX_VALUE/10  ,因为还要做最后一次成10的运算。
            //假如正好有一个数为 2147483647 ,7463847412
            if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE/10 && pop > Integer.MAX_VALUE%10))
                return 0;
            //如果中间值小于integer最小值对10取整的,那么加上余数后肯定小于integer的最小值。
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE/10 && pop < Integer.MIN_VALUE%10))
                return 0;
            //做运算
            rev = rev*10 + pop;
        }
        return rev;
    }

    public static void main(String[] args) {
        int mun = -1463847412;
        mun = reverse2(mun);
        System.out.println(mun);
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值