题目描述:
题目本身不难,但是中间有几个点是比较值得注意的。
最一开始的思路是,先求出该整数的长度, 然后循环对10取模,然后整除10,然后求出来的每一位数,都乘上对应的几个10;
原始代码如下:
class Solution {
public int reverse(int x) {
if (x == 0) {
return 0;
}
else {
int y = x;
int len = 1; //记录整数的长度
while (y / 10 != 0) {
y /= 10;
len++;
}
int t = 0; //存储求余得到的个位数
int fanzhuan_result = 0;
for (int i = 0; i < len; i++) {
t = x % 10;
fanzhuan_result = (fanzhuan_result + t) * 10;
x /= 10;
}
return fanzhuan_result / 10;
}
}
}
存在问题:
按照这种思路,如果翻转得到的结果没有溢出,那就是正常的,但是如果翻转后溢出了,那就是不可取的了。
没有考虑到的点:
①记录整数长度这里,可以用while循环,判断条件是 x != 0,这样边计算边判断 x 是否已经被整除完毕,就可以省去求整数长度这段多余的代码。
②没有考虑到数据溢出的问题,例如:当 x = 1534236469,int的最大上限也就是 2147483647, 输入的 x 没有问题,但是翻转过后,因为原来个位数是9,所以翻转后,数值就变成了 90 多亿,已经溢出了
解决思路
可以将 fanzhuan_result的类型改为 long 类型,这样它的长度就能比int的长度还要长一些;就保证了数据不会溢出的问题;
但是这样得到的结果 fanzhuan_result 是 long 类型的,题目中要求的是返回一个翻转后的整数,所以最后还需要强制类型转换成 int 类型;
这样在计算得到 long 类型的 fanzhuan_result 之后,可以用 if 语句判断,如果把 fanzhuan_result 强转为 int 类型之后,它的结果跟 long 类型的结果是一致的,就说明翻转后的数据没有溢出,如果强转后的结果与 long 类型的结果不一致,那就说明数据溢出了,直接返回 0 即可;
改进后的代码如下:
class Solution {
public int reverse(int x) {
if (x == 0) {
return 0;
}
else {
int y = x;
long fanzhuan_result = 0;
int t = 0;
while (x != 0) {
t = x % 10;
fanzhuan_result = fanzhuan_result * 10 + t;
x = x / 10;
}
// System.out.println(fanzhuan_result);
if ((int) (fanzhuan_result) == fanzhuan_result) {
return (int)fanzhuan_result;
}
else {
return 0;
}
}
}
}