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

目录

一、题目描述

二、解题思路

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

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

相关推荐
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习1 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA2 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo2 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc2 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
游是水里的游3 小时前
【算法day20】回溯:子集与全排列问题
算法
yoyobravery3 小时前
c语言大一期末复习
c语言·开发语言·算法
Jiude3 小时前
算法题题解记录——双变量问题的 “枚举右,维护左”
python·算法·面试
被AI抢饭碗的人3 小时前
算法题(13):异或变换
算法
nuyoah♂4 小时前
DAY36|动态规划Part04|LeetCode:1049. 最后一块石头的重量 II、494. 目标和、474.一和零
算法·leetcode·动态规划