题目描述:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。(假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。)
解题思路:
- 先判断传入的整数是否溢出
- 判断传入整数是否为正整数(若为负整数则转为正整数再进行反转操作)
- 将整数进行反转:
- 累计整数的位数和对应位数的数字传入数组中
- 将数组中的数字进行相反的位数处理
- 代码如下:
/**
* @author: 不会飞的小鹏
* @date: 2020/8/13 23:11
* @description: Reverse's BASE 进制
*/
static final int BASE = 10;
/**
* @author: 不会飞的小鹏
* @date: 2020/8/13 23:13
* @description: Reverse's MAX_NUMBER 最大的int数
*/
static final int MAX_NUMBER = (int) (Math.pow(2,31) - 1);
/**
* @author: 不会飞的小鹏
* @date: 2020/8/13 23:13
* @description: Reverse's MIN_NUMBER 最小的int数
*/
static final int MIN_NUMBER = (int) -(Math.pow(2,31));
/**
*
* reverseNumber 对数字进行反转
*
* @author: 不会飞的小鹏
* @date: 2020/8/13 23:13
* @param intNum
* @return: int
*/
public static int reverseNumber(int intNum){
// 传入整数溢出或为0
if (intNum < MIN_NUMBER || intNum > MAX_NUMBER || intNum == 0){
return 0;
}else {
// 用long类型存储,避免反转过程整数溢出(后续需改进)
long num = intNum;
// 为0直接返回
// 数字为正整数
if (num > 0) {
// 进行反转
long resultNum = positiveNumberReverse(num);
if (resultNum > MAX_NUMBER){
return 0;
}else {
return (int) resultNum;
}
}else { // 数字为负数
// 转为正整数
num = (-1) * num;
// 进行反转并将结果转为负整数
long resultNum = (-1) * positiveNumberReverse(num);
if (resultNum < MIN_NUMBER){
return 0;
}else {
return (int) resultNum;
}
}
}
}
/**
*
* positiveNumberReverse 对正整数进行反转
*
* @author: 不会飞的小鹏
* @date: 2020/8/13 23:19
* @param num
* @return: long
*/
public static long positiveNumberReverse(long num){
int digit = 1;
long resultNum = 0;
long[] units = new long[33];
while (num / BASE >= 1){
units[digit - 1] = (num % BASE);
digit = digit + 1;
num = num / BASE;
}
units[digit - 1] = num;
int index = digit;
for (int i = 0; i < index; i++){
resultNum += units[i] * Math.pow(BASE,digit - 1);
digit--;
}
return resultNum;
}
-
执行结果:
- 负整数溢出结果:
- 负整数无溢出结果:
- 正整数溢出结果:
- 正整数无溢出结果: