题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123 输出: 321
示例 2:
输入: -123 输出: -321
示例 3:
输入: 120 输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解决方案
方法一
思路:数字反转可以先将数字转换为字符串,然后倒着循环字符串拿到反转后的值。但是需要注意几个问题。首先,数值是负数的情况,需要处理“-”,另外就是可能反转后会出现溢出的现象。因此转成字符串后,先将字符串转为long,判断是否超过Integer.MAX_VALUE,溢出输出0,或者报异常。
代码:
public static int reverse(int x) { String s = String.valueOf(x); if(s.length() <= 1) { return x; } StringBuilder builder = new StringBuilder(); int j = 0; char firstChar = s.charAt(0); if(firstChar == '-') { builder.append('-'); j = 1; } for(int i = s.length() - 1; i >= j; i--) { builder.append(s.charAt(i)); } long result = Long.valueOf(builder.toString()); //如果翻转后的数字超过int类型范围,则返回0 if(result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) { return 0; } return (int) result; }
方法二
思路:一个整数的个位数是多少,其实就是x%10,然后要获取十位数上面的值,则x=x/10,再去取x%10,拿到十位数的值。如果x是一个三位数,则反转后的状态是个位数*(位数-1)。设当前计算结果为ans
,下一位为pop
。
代码:
public int reverse(int x) { int ans = 0; while (x != 0) { if ((ans * 10) / 10 != ans) { ans = 0; break; } ans = ans * 10 + x % 10; x = x / 10; } return ans; }