面试题——整数逆向

题目:给定一个整数,请将整数的每一位进行逆向,溢出的整数返回0。

例如:输入12345——输出54321           输入3450——输出543

           输入3450——输出543

分析

类似于字符串的反转一样,可以借助栈来实现。但是这样会创建额外的空间,造成不必要的浪费。所以采用数学方法,来解决这道题。

首先考虑的是,给定一个整数X,将X%10,得到的余数正好是该整数的最后一位。 再将整数X/10,就能得到除刚才求余除外的数。再将得到的数求余,就会得到上一位整数的最后一位数。举个例子,整数1234,1234%10=4,得到最后一位数。1234/10=123,再将123%10=3,然后将前一位得到的数4*10+3=43,反复如此操作,就能得到反转后的数字。

但是有一点要考虑,就是反转之后的数字可能会溢出,其中包括正整数和负整数。我们就需要找出溢出的时刻出现在什么阶段。还是给定一个整数1234,假设int类型的最大上限是4310(打个比方),但是1234反转之后是4321,很明显溢出了。按照上面的方法反转。正好是在12%10=2,12/10=1,前面求的值是43,再继续计算下去,43*10+2=432。在这个时候就得要判断与4310/10=431的大小,很明显432是溢出了,因为在432*10+求出的余数是大于431*的,所以在计算到倒数第二位就应该判断是否溢出。

代码实现

package cn.mrlij.algorithm;

public class ReverseInt {

    public static void main(String[] args) {
        int reverseInt = reverseInt(1234);
        System.out.println(reverseInt);
    }

    /**
     * 整数反转
     * @param target  目标整数
     * @return
     */
    public static int reverseInt(int target){
        int max = Integer.MAX_VALUE/10;
        int min = Integer.MIN_VALUE/10;
        int maxPop = Integer.MAX_VALUE % 10;
        int minPop = Integer.MIN_VALUE % 10;
        int res = 0;
        while (target != 0){
            target = target / 10;
            int pop = target % 10;
            if(target > max || (target == max && pop > maxPop)){
                return 0;
            }
            if(target < min || (target == min && pop <minPop)){
                return 0;
            }
            res = res * 10 +pop;
        }
        return res;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值