概述 Reverse Integer 简单题,要求将不带符号位的整数反转,如果遇到溢出问题,则输出0。
分析 题目的特别之处在于溢出的处理,数字反转之后很可能超过了 Integer.MAX_VALUE
或者Integer.MIN_VALUE
的范围,应对这种情况,可以将溢出整数范围的的结果认定为0。
参见 SO 上的问题 How does Java handle integer underflows and overflows and how would you check for it? , Java的处理方式是在两个极值之间轮转,超过最大值(2147483647
),则从最小值开始逐步趋近最小值(-2147483648
),如:
1 2 3 4 5 6 Long l = Long.parseLong("2147483648" ); System.out.println(l.intValue()); l = Long.parseLong("2147483649" ); System.out.println(l.intValue()); l = Long.parseLong("2147483650" ); System.out.println(l.intValue());
输出结果为:
1 2 3 -2147483648 -2147483647 -2147483646
反之亦然。
解法先用字符串操作的方式进行,还需要探究更高效的算法。
解法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class Solution { public int reverse (int x) { StringBuffer sb = new StringBuffer(x + "" ); Long xL; int factor = 1 ; if (sb.substring(0 , 1 ).equals("-" )) { factor = -1 ; xL = Long.parseLong(sb.replace(0 , 1 , "" ).reverse().toString()); } else { xL = Long.parseLong(sb.reverse().toString()); } if (factor > 0 && xL > Integer.MAX_VALUE) { return 0 ; } if (factor < 0 && (-1 * xL) < Integer.MIN_VALUE) { return 0 ; } return xL.intValue() * factor; } }