目录
一、题目描述
给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。
如果反转后整数超过32位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储64位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-231 <= x <= 231 - 1
二、解题思路
首先,我们需要明确题目中给定的整数是有符号的,即可以为正数也可以为负数。所以在进行反转操作时,我们需要保留原数的符号。其次,我们需要注意整数反转之后的结果可能会超出整数的范围。比如,反转后的结果可能会超出32位有符号整数的范围,即-2^31到2^31-1。因此,我们需要在进行反转操作时,判断反转后的结果是否超出了范围,如果超出了范围,则返回0。
1、整数转为字符串
这种方法就是将整数转换为字符串,然后进行反转操作。在这个过程中,我们通过捕获NumberFormatException
异常来处理那些超出有符号整数范围的反转数据。具体来说,如果反转后的数字超出了整数的最大或最小限制,然后再将其转换回整数时会抛出该异常。在这种情况下,我们便返回0作为结果。
显然这种方法在实现上较为简单直观,但其时间效率并不理想。这是因为字符串与整数之间的转换以及后续的异常处理机制都带来了额外的计算开销。因此,如果对程序的时间性能有较高要求,我们可能需要考虑其他更高效的算法来执行整数的反转操作。
2、数学运算
该方法就是每次取末尾数字,并且判断此时去掉末尾数字后的x是否为0,为0就循环结束,不为0就继续循环,用取余10的方式不断将x的末尾数字取出,然后在不断的加到待返回值上,实现反转的效果。当然,这里也是需要判断反转的结果是否超出有符号整数的范围。如果超出的话,跳出循环,直接返回0。
三、参考答案
按照上述思路分析分别得出的参考代码如下,
整数转为字符串方法参考代码:
java
class Solution {
public int reverse(int x) {
try{
if(x>0){
//将int类型的数字转换成字符串
String str = new StringBuilder(x+"").reverse().toString();
return str.startsWith("0") ? Integer.valueOf(str.substring(1)):Integer.valueOf(str);
}else if(x<0){
//将int类型的数字转换成字符串
String str = new StringBuilder(String.valueOf(x+"").substring(1)).reverse().toString();
return str.startsWith("0") ? Integer.valueOf("-"+str.substring(1)):Integer.valueOf("-"+str);
}else{
return x;
}
}catch(NumberFormatException e){
return 0;
}
}
}
数学运算方法参考代码:
java
class Solution {
public int reverse(int x) {
int res = 0;
while(x!=0) {
//每次取末尾数字
int tmp = x%10;
//判断是否大于最大32位整数
if (res>214748364 ) {
return 0;
}
//判断是否小于最小32位整数
if (res<-214748364) {
return 0;
}
res = res*10 + tmp;
x /= 10;
}
return res;
}
}
综合以上分析,整数反转问题可以通过将整数转换为字符串或采用数学运算的方式来解决。每种方法都有其特点,但关键在于处理溢出问题,确保最终结果的准确性。尽管两种方法都能达到目的,我们更倾向于推荐使用数学运算的方法。相较于字符串转换,数学运算通常能提供更高的效率,特别是在处理大规模数据或要求高性能的应用场景中,这一优势尤为明显。因此,在考虑实现整数反转时,优先考虑数学方法将是更优的选择。