给定整数(可正数可负数)32位有符号整数,反转整数部分,反转的结果可能是超出32位有符号整数部分,如果超出那么返回0.
而且要求中间不允许出现64位有符号整数存储。
-
第一种解法:
采用整数转字符串,利用双指针反转字符串
public int reverse(int x) {
boolean flag = false;
long y = x;
if(y < 0) {
flag = true;
y = - y;
}
char[] charArray = String.valueOf(y).toCharArray();
int i = 0, j = charArray.length - 1;
while (i < j) {
char c = charArray[i];
charArray[i] = charArray[j];
charArray[j] = c;
i ++; j --;
}
String s = new String(charArray);
Long aLong = Long.parseLong(s);
if (flag) aLong = - aLong;
if(aLong > Integer.MAX_VALUE || aLong < Integer.MIN_VALUE) return 0;
else return aLong.intValue();
}
需要注意的问题:反转字符串后可能出现超出32位有符号数范围,因此再转数字需要long类型,不符合题意要求。
- 第二种解法:
利用取余法逆序取出每一位。
class Solution {
public int reverse(int x) {
long ans = 0;
while (x != 0) {
ans = ans * 10 + x % 10;
if (ans > Integer.MAX_VALUE || ans < Integer.MIN_VALUE) {
return 0;
}
x = x / 10;
}
return (int) ans;
}
}
此解决方案:也用到了 long 类型。
3. 解决方式
同2一样思路,但用 int 类型存 ans,ans 可能存在溢出,当 x > 0 时, ans * 10 + x % 10 > Integer.MAX_VALUE 时溢出, 将条件作等价变换 ans > (Integer.MAX_VALUE - x % 10) / 10; 此等式不会发生溢出,但此等式成立,表示反转数字出现了溢出。同理,当 x < 0 时, ans * 10 + x % 10 < Integer.MIN_VALUE 溢出。
class Solution {
public int reverse(int x) {
int ans = 0;
while (x != 0) {
if(x > 0 && ans > (Integer.MAX_VALUE - x % 10) / 10) return 0;
if(x < 0 && ans < (Integer.MIN_VALUE - x % 10) / 10) return 0;
ans = ans * 10 + x % 10;
x = x / 10;
}
return ans;
}
}