整数反转-java

题目描述:(力扣题库7)

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0

假设环境不允许存储 64 位整数(有符号或无符号)。

  • 示例 1:

输入:x = 123
输出:321
  • 示例 2:

输入:x = -123
输出:-321

  • 提示: -231 <= x <= 231 - 1
法一:
解题思路:

反转一个整数看起来简单,但实际操作中存在许多容易被忽略的细节。一不小心,代码就可能出现错误,或者仅在某些案例下有效。在解决这个问题时,关键在于正确提取整数的末位数字。除此之外,还需要考虑负数的情况,以及反转后可能出现的溢出问题。在编写代码时,务必考虑到这些方面,确保算法的准确性。

解题步骤: 
  •  1. 初始化一个变量   reversed ,用于存储逆序排列后的结果,初始值为0。使用while循环,条件为( X != 0 )
    int reversed = 0;
    while(x != 0){
        int fresh = reversed * 10 + x % 10;
        
        reversed = fresh;
            x /= 10;
    }
  • 注意,循环条件不能为 ( x > 0 ), 否则,当传入的数字为负数时,while循环不会执行.
  • 这样,我们就拿到了整数的末尾数字,并合成得到了一个新的整数,但这个新的整数可能超出了int类型能表示的范围,所以我们应当在循环中,做一些判断,当新的整数会溢出时,返回0

  • 2.  检查是否发生整数溢出:
    • 如果 (fresh  -  x  %  10)   /  10  !=  reversed,则说明发生了溢出,返回0。
    • 如果新的整数 fresh 没有溢出, 那么 fresh  减去末尾数字 x % 10 就等于更新前的整数 reversed  , 如果新的整数 fresh 溢出, 存储的数据会丢失, 此时 fresh  , 不是我们所预期的结果.
    • 以下是补充完整的while 循环的代码
      •         int reversed = 0;
                while(x != 0){
                    int fresh = reversed * 10 + x % 10;
        
                    if((fresh - x % 10) / 10 != reversed)
                        return 0;
        
                    reversed = fresh;
                    x /= 10;
                }

    • 3.最后:
      • 如果没有return 0, 没有执行的话,说明反转后的整数没有溢出,直接返回该整数.

      • 接下来是完整的代码

        • class Solution {
              public int reverse(int x){
                  int reversed = 0;
                  while(x != 0){
                      int fresh = reversed * 10 + x % 10;
          
                      if((fresh - x % 10) / 10 != reversed)
                          return 0;
          
                      reversed = fresh;
                      x /= 10;
                  }
          
                  return  reversed;
              }
          
          }

  • 除此之外,我们还可能想到利用字符串一类,将整数反转,并进行输出.这种方法可以精准地得到整数反转后的结果,但是题目中要求---" 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。", 这时还需进一步判断,反转后的整数是否溢出了.
  • 法二:
  • 这个问题的解题思路可以总结如下:

    1. 处理负数情况:首先,我们需要判断输入的整数是否为负数,以便在最后返回逆序排列后的整数时正确处理符号。

    2. 逆序排列数字:我们可以使用取余运算和除法运算来逐位获取输入整数的数字,并将其逆序存储在一个字符串或StringBuilder中。

    3. 处理溢出情况:在将逆序排列后的数字转换回整数时,可能会遇到整数溢出的情况。为了处理这种情况,我们可以尝试将字符串表示的逆序排列后的数字转换为整数,并在转换过程中捕获可能的数字格式异常。

    4. 返回结果:最后,根据输入整数的符号情况,返回逆序排列后的整数或处理溢出时返回0。

    通过这个思路,我们可以编写一个能够逆序排列整数并处理溢出情况的方法。

  • 以下是具体的解题步骤:​​​​​​​
    • boolean isNegative = x < 0; 这一行检查输入整数是否为负数,并将结果存储在 isNegative 变量中。

    • x = Math.abs(x); 如果输入整数是负数,这一行将其转换为正数,以便后面处理。

    • StringBuilder reversedStr = new StringBuilder();:创建一个 StringBuilder 对象 reversedStr,用于存储逆序排列后的整数。

    • while(x != 0){: 这是一个循环,用来逐位获取输入整数的数字并将其添加到 reversedStr 中,直到 x 变为0为止。

    • reversedStr.append(x % 10); x 的个位数字添加到 reversedStr 中。

    • x /= 10; 将 x 除以10,以便在下一次迭代中处理下一个数字。

    • try { ... } catch (NumberFormatException e) { ... }: 这是一个异常处理块,用于捕获可能的数字格式异常,即当逆序排列后的整数超出整数范围时。

    • int reversed = Integer.parseInt(reversedStr.toString()); 将 reversedStr 中的逆序排列后的数字转换为整数。

    • return isNegative ? -reversed : reversed; 如果输入整数是负数,则返回逆序排列后的整数的负值;否则返回逆序排列后的整数。

    • return 0; 如果在转换整数时发生了数字格式异常,即整数溢出的情况,返回0作为溢出处理结果。

      • class Solution {
            public static int reverse(int x) {
                boolean isNegative = x < 0;
                x = Math.abs(x);
        
                StringBuilder reversedStr = new StringBuilder();
                while (x != 0) {
                    reversedStr.append(x % 10);
                    x /= 10;
                }
        
                try {
                    int reversed = Integer.parseInt(reversedStr.toString());
                    return isNegative ? -reversed : reversed;
                } catch (NumberFormatException e) {
                    return 0;
                }
            }
        }

  • 以上就是本篇文章的全部内容,该偏博客文字讲述偏多,也掺杂了博主自己的一些想法与见解,内容如若有不妥之处,敬请谅解.

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值