描述;
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
题点一:如何得到一个反转的数,可以转为字符串,也可以用数学方法计算
题点二:溢出问题该怎么判断(重点)
解法一:
class Solution {
public int reverse(int x) {
if (x < 10 && x> -10){
return x;
}
long r;
long result = 0;
for (long i = 10; ;i = i * 10){
if ((x / i) < 10 && (x / i) > -10){
for (; i>=1;i = i /10){
r = x % 10;
result = result + r*i;
x = (int)(x - r) / 10;
}
return (int)result == result ? (int)result : 0;
}
}
}
}
教训:int * int = int,不注意这点会让人疯狂
解法二(稍作优化):
class Solution {
public int reverse(int x) {
long n = 0;
while(x != 0) {
n = n*10 + x%10;
x = x/10;
}
return (int) n == n ? (int) n : 0;
}
}
上面单纯以long 与 int 是否相等来判断溢出可能会出现bug,再者题目声明只能存储32位
解法三(来自leetcode用户twobugs):
class Solution {
public int reverse(int x) {
int result = 0;
while (x != 0) {
// 因为int 边界值(10位数) 的第一位只可能为1或者2,故result * 10 + result % 10 = 末位0 +末位1||2, 不可能溢出
if ((result * 10) / 10 != result) {
result = 0;
break;
}
result = result * 10 + x % 10;
x = x / 10;
}
return result;
}
}