leetcode7.ReverseInteger(整数反转)

题目:Reverse Integer
描述
Given a 32-bit signed integer, reverse digits of an integer.

Example 1:
Input: 123
Output: 321

Example 2:
Input: -123
Output: -321

Example 3:
Input: 120
Output: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
来源:力扣(LeetCode)

分析
1.给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
题目本身并不困难,重点在于如何判断边界问题。
2.什么是反转整数,示例已经很清楚, 就是给定你一个整数,将它倒序输出,当然,不能忽略了负数的情况。
3.反转整数的方法,可以考虑先转换为字符串,再进行处理,当然也增加了一些步骤。另一种办法,就是利用编程语言的特性,取余%,作除/的结合操作。比如要反转整数123,反转结果为321,很明显,首先得拿到他的个位数字,依次是十位,百位…。
如何取得其各位数值?取余可以做到。以123为例:
第一次:123 %10 = 3;
第二次:12 %10 = 2;
第三次:1 % 10 = 1;

题解一:这题简单,所以借机复习一下其他语言基础知识。
java版本:

    /** * 方法一: * @param x * @return 返回结果 */
    public static int reverse(int x){
   
        long n=0;
        while (x!=0){
   
            n = n*10+x%10;
            x = x/10;
        }
        return (int)n==n?(int)n:0;
    }

python版本:

    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

c++版本:

#include <iostream>
#include <algorithm>
using namespace std;
//整数反转:
int reverse(int x) {
   
    long result = 0;
    while(x!=0){
   
        result = result*10+x%10;
        x = x/10;
    }
    if(result>INT_MAX||result<INT_MIN){
   
        return 0;
    }else{
   
        return result;
    }
}

c版本:

#include <stdio.h>
#include <stdlib.h>
int reverse(int x){
   
    long res = 0;
    while (x!=0){
   
        res = res*10+x%10;
        x/=10;
    }
    return res>2147483647 || res<-2147483648?0:res;
}

解法二:这是一个关于边界的思考:先参考一下。
java中int的取值范围:
2147483647
-2147483648

我们可以对最后一位数字进行判断,如果当取值为214748364时,如果末位数字>-8或者<7明显肯定越界溢出。
Java代码:

 /** * 方法二: * @param x * @return 返回结果res * 注意:int范围 -2^32~2^31(-2147483648 ~ 2147483647) */
    public static int reverse1(int x){
   
         final  int  MAX = 214748364;//最大上限,
         final int MIN = -214748364;//最小上限
        int res = 0;
        while (x!=0){
   
            //取到最后一位数字
            int tmp =  x % 10;
            //判断是否溢出上限(32位整数)
            if (res>MAX ||(res == MAX && tmp>7)){
    //注意:2^31 = 2147483647
                return 0;
            }
            //判断是否溢出下限(32位整数)
            if (res<MIN || (res == MIN && tmp<-8)){
   
                return 0;
            }
            //满足条件,将数据反转
            res = res*10+tmp;
            x/=10;
        }
        return res;
    }

tips:这个算法并非完全原创,借鉴了leetcode大佬王尼玛同学的部分思路。
end--------------------------------------------------------------------------------------------

全部评论

相关推荐

11-04 21:17
江南大学 Java
穷哥们想卷进大厂:肯定会问技术呀,面试你的可能是别人
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务