1. 首页

LeetCode 007. 整数反转

题目描述:

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21
Js 中 文 网 - 全球前端挚爱的技术成长平台 https://www.javascriptc.com/

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−231, 231− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

难度:

  • 难度:简单
  • 支持语言:JavaScriptJavaPython

相关标签

相关企业

  • 阿里
  • 腾讯
  • 微保
  • 有赞

思路 1:

  • 使用字符串在反转并不是最好的选择,因为还需要处理负号和0的情况,用数字运算方式反转比较适合。
  • 每次找到当前数的最后一位,然后作为反转数字的第一位,例如123
123 --> 0*10  + 3
12  --> 3*10  + 2
1   --> 32*10 + 1
  • 再注意保存开始的正负状态和结果的限制[−2^31, 2^31 − 1]

思路 2:

  • 本题如果不考虑溢出问题,是非常简单的。解决溢出问题有两个思路,第一个思路是通过字符串转换加try catch的方式来解决,第二个思路就是通过数学计算来解决。
  • 由于字符串转换的效率较低且使用较多库函数,所以解题方案不考虑该方法,而是通过数学计算来解决。
  • 通过循环将数字x的每一位拆开,在计算新值时每一步都判断是否溢出。
  • 溢出条件有两个,一个是大于整数最大值MAX_VALUE,另一个是小于整数最小值MIN_VALUE,设当前计算结果为ans,下一位为pop
  • ans * 10 + pop > MAX_VALUE这个溢出条件来看
    • 当出现 ans > MAX_VALUE / 10还有pop需要添加 时,则一定溢出
    • 当出现 ans == MAX_VALUE / 10pop > 7 时,则一定溢出,72^31 - 1的个位数
  • ans * 10 + pop < MIN_VALUE这个溢出条件来看
    • 当出现 ans < MIN_VALUE / 10还有pop需要添加 时,则一定溢出
    • 当出现 ans == MIN_VALUE / 10pop < -8 时,则一定溢出,8-2^31的个位数
  • 作者:guanpengchn

思路 3:

  • result * 10 + x % 10 取出末位 x % 10(负数结果还是负数,无需关心正负),拼接到 result 中。
  • x / 10 去除末位,| 0 强制转换为32位有符号整数。
  • 通过 | 0 取整,无论正负,只移除小数点部分(正数向下取整,负数向上取整)。
  • result | 0 超过32位的整数转换结果不等于自身,可用作溢出判断。
  • 运算过程:
x result
123 0
12 3
1 32
0 321

代码

JavaScript 实现

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
  let symbol=x<0 ? -1 : 1
  x=Math.abs(x)
  let res=0
  while(x>0){
    let t=x%10
    res=res*10+t
    x=Math.floor(x/10)
  }
  res*=symbol
  if(res<-Math.pow(2,31) || res>Math.pow(2,31)-1)return 0
  return res
};
/**
 * @作者:zoffer
 * @链接:https://leetcode-cn.com/problems/reverse-integer/solution/wei-yun-suan-ji-jian-jie-fa-by-ijzqardmbd/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {number} x
 * @return {number}
 */

var reverse = function(x) {
    let result = 0;
    while(x !== 0) {
        result = result * 10 + x % 10;
        x = (x / 10) | 0;
    }
    /* 来源:Js 中 文 网 - 全球前端挚爱的技术成长平台 https://www.javascriptc.com/ */
    return (result | 0) === result ? result : 0;
};

Java 实现

/**
 * @作者:jianrry
 * @链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-jianrry/
 */
class Solution {
    public int reverse(int x) {

        int res = 0;
        while (x != 0) {
            int t = x % 10;
            int newRes = res * 10 + t;
            //如果数字溢出,直接返回0
            if ((newRes - t) / 10 != res)
                return 0;
            res = newRes;
            x = x / 10;
        }
        return res;
    /* 来源:Js 中 文 网 - 全球前端挚爱的技术成长平台 https://www.javascriptc.com/ */
    }
}

/**
 * @作者:javaniuniu
 * @链接:链接:https://leetcode-cn.com/problems/reverse-integer/solution/suan-shu-javapython-by-javaniuniu/
 */

public int reverse(int x) {
      String a = Integer.toString(x);
      int b = 1;
      if(a.charAt(0) == '-') {
          a = a.substring(1);
          b = -1;
      }
      char[] chars = a.toCharArray();
      char[] chars1 = new char[chars.length];
      for (int i = chars.length - 1; i >= 0; i--) {
          chars1[chars.length - 1 - i] = chars[i];
      }
      Long aLong = Long.valueOf(new String(chars1));
      if(aLong > Integer.MAX_VALUE || aLong < Integer.MIN_VALUE) {
          return 0;
      }
      return (int) (aLong * b);

  }

Python 实现

# @作者:stray_camel
# @链接:https://leetcode-cn.com/problems/reverse-integer/solution/pythondan-chu-he-tui-ru-shu-zi-yi-chu-qian-jin-xin/

 def reverse_force(self, x: int) -> int:
        if -10 < x < 10:
            return x
        str_x = str(x)
        if str_x[0] != "-":
            str_x = str_x[::-1]
            x = int(str_x)
        else:
            str_x = str_x[:0:-1]
            x = int(str_x)
            x = -x
        return x if -2147483648 < x < 2147483647 else 0


# @作者:xi-ri-dan-zeng
# @链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-xi-ri-dan-zeng/

class Solution:
    def reverse(self, x: int) -> int:
        #将整数的绝对值转换成字符串
        s=str(abs(x))
        #翻转字符串
        s=s[::-1]
        #如果输入整数是负数,增加负号
        if x <0:
            s ='-' + s
        #转换为整数
        result = int(s)
        #判断是否溢出
        if result>=-2**31 and result<=2**31-1:
            return result
        else:
            return 0

其他

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:LeetCode 007. 整数反转

链接:https://www.javascriptc.com/4366.html

« LeetCode 008. 字符串转换整数 (atoi)
LeetCode 006. Z 字形变换»
Flutter 中文教程资源

相关推荐

QR code