题目和需求
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
常规解法
使用字符串回转方法(一般开发中的思路)
public static int reverse1(int x) {
if (x == 0) {
return 0;
} else {
String temp = String.valueOf(x);
StringBuilder sb = new StringBuilder();
int length = temp.length();
if (x > 0) {
for (int i = 0; i < length; i++) {
sb.append(temp.charAt(length - i - 1));
}
return Integer.valueOf(sb.toString());
} else {
for (int i = 0; i < length - 1; i++) {
sb.append(temp.charAt(length - i - 1));
}
return -Integer.valueOf(sb.toString());
}
}
}
这个没有特殊技巧,就是一般实际工作中常见的思路,提出需求你,按需求思路解决需求。
改进算法
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;
}
结题思路:
由于int反转后,可能会超过int最大值,所以使用long存储中间值,最后用强转后对比值大小判断是否有值溢出
从后往前,每次取到除以10的余数,每次循环一次,将上次所得值乘以10.
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMzImN5QDOkFzYmZDMjVDNiRDZiFjM3EzMlRTO1kDM28CX0IzLcRDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
更多限制
public static int reverse(int x) {
if (x == 0) {
return 0;
} else {
int ret = 0;
while (x != 0) {
int temp = ret;
ret = (ret * 10) + (x % 10);
if (temp != ret / 10)
return 0;
x = x / 10;
}
return ret;
}
}
if (temp != ret / 10)一定要在加法完成后计算是否越界
有些算法喜欢直接在上一步就比较是否大于int.maxvalue和小于int.minvalue,这是错的,因为java溢出继续添加,并不会报错,而是会继续进位。