【算法题】整数反转,一文彻底搞清!

目录

一、题目描述

二、解题思路

1、整数转为字符串

2、数学运算

三、参考答案


一、题目描述

整数反转

给你一个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;
    }
}

综合以上分析,整数反转问题可以通过将整数转换为字符串或采用数学运算的方式来解决。每种方法都有其特点,但关键在于处理溢出问题,确保最终结果的准确性。尽管两种方法都能达到目的,我们更倾向于推荐使用数学运算的方法。相较于字符串转换,数学运算通常能提供更高的效率,特别是在处理大规模数据或要求高性能的应用场景中,这一优势尤为明显。因此,在考虑实现整数反转时,优先考虑数学方法将是更优的选择。

相关推荐
Jerry3 小时前
LeetCode 160. 相交链表
算法
Jerry3 小时前
LeetCode 19. 删除链表的倒数第 N 个结点
算法
金銀銅鐵3 小时前
费马小定理
python·数学·算法
技术不好的崎鸣同学5 小时前
[ACTF2020 新生赛]Exec 思路及解法
算法·安全·web安全
Full Stack Developme6 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
Jerry7 小时前
LeetCode 707. 设计链表
算法
C语言小火车8 小时前
C++ 堆排序深度精讲:基于完全二叉树的选择排序进化,最坏情况 O(n log n) 的稳定王者
开发语言·c++·算法·排序算法·堆排序
weixin_400005608 小时前
Vision-Language-Action:LMDrive双损失函数训练模块与 LangAuto 基准评测框架
人工智能·深度学习·算法·机器学习·自动驾驶
kebidaixu8 小时前
两轮BMS AFE SH367306 I2C 读写时序
算法