基于Java的一些结题总结。
题目描述及示例:

一、解题思路
定义一个result变量,用于存储结果。利用 x%10 每次取出待反转数的最后一位,通过result += result * 10 + x % 10;来加和。
需要注意的是,转换后得到的结果存在溢出的风险,即超出题目限定的范围。因此在定义变量是把result声明为long类型。
二、自写代码
class Solution {
public int reverse(int x) {
long result = 0;
while(x != 0){
int temp = x % 10;
result = result * 10 + temp;
x = x / 10;
}
//判断是否产生溢出
return (int)result == result?(int)result:0;
}
}
三、自写代码结果分析
时间复杂度T(n) = O(log2n),空间复杂度S(n) = O(1)。
运行结果如下:

返回结果时,利用了强制类型转换有可能造成数据丢失的特性,如果反转得到的数有溢出,则在从long转为int是为有数据丢失。从而避免了用大于小于等判断符的繁琐。
利用三目运算符?:会使代码简洁很多。
//判断是否产生溢出
return (int)result == result?(int)result:0;
为了进一步精简代码,加和部分也可以直接写成
result = result * 10 + x % 10;
四、别人的解决方案
public int reverse(int x) {
int res = 0;
while (x != 0) {
int t = x % 10;
int newRes = res * 10 + t;
//如果数字溢出,直接返回0
if ((newRes - t) / 10 != res)
return 0;
res = newRes;
x = x / 10;
}
return res;
}
作者:sdwwld
链接:https://leetcode-cn.com/problems/reverse-integer/solution/tu-wen-
这里主要是判断是否溢出的具体实现有所不同。原理是一样的,利用的int类型的溢出风险来判断。但是自写代码中的比较方法会更加简洁。
五、总结
由于存在溢出的风险,先定义成long来保存真实结果,这个想法挺好。
题目较为简单,没啥好总结的。
182

被折叠的 条评论
为什么被折叠?



