算法√ <整数反转(考虑整数的边界问题)>
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);
}
}