问题描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
方法1:自己写的,比较烂
int reverse(int x) {
//最笨的办法=>把整型转为字符串类型,然后用for循环翻转,得到的数字用long型接收,再与int的极值做比较,返回结果
String xx = x+"";
String res = "";
if(x>0) {
for(int i=xx.length()-1;i>=0;i--) {
res+=xx.charAt(i);
}
if(Long.parseLong(res)>(Integer.MAX_VALUE)) {
return 0;
}else {
return Integer.parseInt(res);
}
}else {
long longx = Long.parseLong(x+"");
long abs = Math.abs(longx);
System.out.println(abs+"abs");
String res2 = abs+"";
for(int i=res2.length()-1;i>=0;i--) {
res+=res2.charAt(i);
}
if(0-Long.parseLong(res)<Integer.MIN_VALUE) {
return 0;
}else {
return 0-Integer.parseInt(res);
}
}
}
方法二:官方答案
public int reverse(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.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
解析:输入的数值不断除以10,得到余数,就是得到个位数,十位数,百位数等等。
然后利用得到的余数,不断×10+余数,就可以得到翻转的数值。
为了防止溢出,需要加判断,7和-8是2^3-1和-2^3得来的。