题目:给定一个整数,请将整数的每一位进行逆向,溢出的整数返回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;
}
}