1 问题
Given a signed 32-bit integer x
, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-$2^{31}$, $2^{31}$ - 1]`, then return 0.
Assume the environment does not allow you to store 64-bit integers (signed or unsigned).
1.1 Example 1
Input: x = 123
Output: 321
1.2 Example 2
Input: x = -123
Output: -321
1.3 Example 3
Input: x = 120
Output: 21
提示
- -$2^{31}$ <= x <= $2^{31}$ - 1
2 解题思路
2.1 解法一
利用StringBuilder
的reverse()
方法,实现逆转。因题目要求不能用其他大数据类型存储整数,又Integer.MAX_VALUE为10位整数,所以当逆转过程中的数字位数超过10位时,需要比较高5位,低5位对应值分别于21474
和83647
的大小,只要有一个结果是大于,则返回0;否则,继续遍历该数的下一位。
详见代码中的解法一。
2.2 除取余
同解法一比较思想,只是这里是通过除取余,按位逆转,当中间值res>Integer.MAX_VALUE / 10
,返回0;否则,继续除取余。
详见代码中的解法二。
3 代码
class Solution {
// 解法一:StringBuilder.reverse
public int reverse2(int x) {
StringBuilder sb = new StringBuilder();
String res = sb.append(Math.abs(x)).reverse().toString();
// Integer.MIN_VALUE=-2147483648
// Integer.MAX_VALUE=2147483647
if (res.length() >= 10) {
if (Integer.parseInt(res.substring(0, 5)) > 21474 || Integer.parseInt(res.substring(5, 10)) > 83647) {
return 0;
}
}
int num = Integer.parseInt(res);
return x < 0 ? -1 * num : num;
}
// 解法二:%,除取余
public int reverse(int x) {
boolean minusFlag = x < 0;
int originalX = x;
if (minusFlag) {
originalX = -1 * x;
}
int res = 0;
int modNum;
while (originalX > 0) {
modNum = originalX % 10;
//ouside the range of [-2^31,2^31-1]
if (res > Integer.MAX_VALUE / 10) {
return 0;
}
res = res * 10 + modNum;
originalX /= 10;
}
return minusFlag ? -1 * res : res;
}
}