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

目录

一、题目描述

二、解题思路

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;
    }
}

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

相关推荐
带多刺的玫瑰43 分钟前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
爱敲代码的憨仔44 分钟前
《线性代数的本质》
线性代数·算法·决策树
yigan_Eins1 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
阿史大杯茶1 小时前
AtCoder Beginner Contest 381(ABCDEF 题)视频讲解
数据结构·c++·算法
დ旧言~2 小时前
【高阶数据结构】图论
算法·深度优先·广度优先·宽度优先·推荐算法
张彦峰ZYF2 小时前
投资策略规划最优决策分析
分布式·算法·金融
The_Ticker2 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
爪哇学长3 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
Dola_Pan3 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
繁依Fanyi3 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse