题目:给定一个32位有符号整数,将整数中的数字进行反转。
输入: 123
输出: 321
输入: -123
输出: -321
输入: 120
输出: 21
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]。
根据这个假设,如果反转后的整数溢出,则返回 0。
代码如下:
public class ReverserNum {
public static void main(String[] args) {
int result = reverse1(-2147483648);
// int result = reverse2(-2147483648);
// int result = reverse3(-2147483612);
System.out.println(result);
}
/**
* 方法一:暴力法
* @param x
* @return
*/
public static int reverse1(int x) {
try {
//先判断是否为正数
boolean flag = true;
if (x < 0){
flag = false;
x = Math.abs(x);
}
//先将数字转换为字符串
String num = String.valueOf(x);
char[] nums = num.toCharArray();
//下标
int middle = nums.length / 2;
int max = nums.length - 1;
for (int i = 0; i < middle; i++) {
char temp = nums[i];
nums[i] = nums[max];
nums[max] = temp;
max--;
}
//如果为负数
if (!flag) {
return Integer.parseInt("-" + new String(nums));
}
return Integer.parseInt(new String(nums));
}catch (Exception e){
return 0;
}
}
/**
* 方法二: 弹出和推入数字以及溢出前进行检查
* 思路:
* 可以一次构建反转整数的一位数字。在这样做的时候,
* 可以预先检查向原整数附加另一位数字是否会导致溢出。
* 我们想重复“弹出” x的最后一位数字,并将它“推入”到 rev 的后面。最后rev 将与 x 相反。
* 要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法
*
* ****pop****
* pop = x % 10 pop为最后一位数字
* x /= 10 弹出最后一位数字
* ****push****
* temp = rev * 10 + pop 将最后一位推入到的第一位
* rev = temp 赋值
*
* 但是,这种方法很危险,因为当 temp = rev⋅10 + pop 时会导致溢出。
* 幸运的是,事先检查这个语句是否会导致溢出很容易。
* 为了便于解释,我们假设 rev 是正数。
* 1.如果 temp=rev⋅10+pop 导致溢出,那么一定有rev >= INTMAX/10
* 2.如果rev > INTMAX/10,那么temp = rev * 10 + pop一定会溢出
* 3.如果rev == INTMAX/10,那么只要pop > 7,temp = rev * 10 + pop就会溢出
* @param x
* @return
*/
public static int reverse2(int x) {
int rev = 0;
while (x != 0){
int pop = x %10;
x /= 10;
if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)){
return 0;
}
if (rev > Integer.MAX_VALUE || (rev == Integer.MAX_VALUE / 10 && pop < -8)){
return 0;
}
rev = rev * 10 + pop;
}
return rev;
}
/**
* 方法三: 使用StringBuffer.reverse()方法
* @param x
* @return
*/
public static int reverse3(int x) {
int result;
int pre = (x<0)?(-1):1;
String a = Integer.toString(x*pre);
String b = new StringBuffer(a).reverse().toString();
try{
result=(Integer.parseInt(b))*pre;
}catch(Exception e){
result=0;
}
return result;
}
}