Leetcode-7 整数反转

一、题目描述

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

示例 1:

输入: 123
输出: 321
示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21

注意:

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

二、题目分析

题目注意点,不能超出范围 [−231, 231 − 1]。如果反转后整数溢出那么就返回 0。

1.python3方法

首先利用字符串函数str,将数字转化为字符串x2str,这样通过len函数统计出数字的长度,如果长度大于32,既可直接返回0。然后建立空的哈希表haxi,通过字符串x2str的首字符判断整数是正数还是负数,然后通过第一个循环把字符x2str字符赋值到哈希表中。通过第二个循环把哈希表中倒序的元素取出并赋值给字符串a(最后把该字符串转化为整数即可),最后需要对倒序的整数进行检测,判断是否出现的倒序后溢出的现象。

class Solution:
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        x2str=str(x)
        if len(x2str) <= 32:
            haxi={}
            a=''
            if x2str[0] == '-':
                haxi[0] = '-'
                for i in range(1,len(x2str)):
                    haxi[i] = x2str[len(x2str) - i]
            else:
                for i in range(len(x2str)):
                    haxi[i]=x2str[len(x2str)-1 - i]
            for i in haxi.values():
                a=a+str(i)
            if (int(a) >=  -2**31) and (int(a) <= (2**31-1)):
                 return int(a)
            else:
                return 0
        else:
            return 0
        

python3耗时:76ms

2.官网答案分析

在这里插入图片描述

以上算法解释:
1.INTMAX代表正数最大值:231-1,INTMIN代表负数最小值:-231。

2.X是正数:如果rev迭代使得rev*10 > INTMAX,即temp=rev 10 +pop不满足等式,一定会溢出。由于2**31-1==2147483647,即如果rev10 == INTMAX=214748364时,而且末尾数字pop > 7 时,则一定会溢出。

3.X是负数:如果rev迭代使得rev*10 < INTMIN,即temp=rev 10 +pop不满足等式,一定会溢出。由于-2**31==-2147483648,即如果rev10 == INTMIN=214748364时,而且末尾数字pop < -8 时,则一定会溢出。(**注意:**负数在c++求余数只有依旧为负数,所以temp和rev都是负数,最后得到的也是负数,所以不用考虑负号)

官网c++实现:

class Solution {
public:
    int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
            if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }
};

c++耗时20ms

Python3实现:
通过模仿c++之后,负数检测出错,所以在python3中加入判断是否为负数的判断,即可转化为正数,和整数操作一样,但最后返回值时加负号:

class Solution:
    def reverse(self,x):
        rev=0
        INTMAX=2**31-1
        INTMIN=-2**31
        if x>=0:
            while(x != 0):
                pop = x % 10
                x = int(x / 10)
                if(  rev>int(INTMAX/10)  or  ( rev == int(INTMAX/10) and pop > 7)  ):
                    return 0
                if(  rev < int(INTMIN/10) or   ( rev == int(INTMIN/10) and pop < -8)  ):
                    return 0
                rev =rev*10 +pop
            return rev
        else:
            x=-x
            while (x != 0):
                pop = x % 10
                x = int(x / 10)
                if (rev > int(INTMAX / 10) or (rev == int(INTMAX / 10) and pop > 7)):
                    return 0
                if (rev < int(INTMIN / 10) or (rev == int(INTMIN / 10) and pop < -8)):
                    return 0
                rev = rev * 10 + pop
            return -rev

python3耗时:72ms

注意点:

1.字典运算:
在字典中循环:for i in haxi.values();
在字典中循环用:for i in haxi.keys();
获取字典值:haxi1.get(键),或者haxi1[键]。
2.注意判断逻辑:第一个中的正数和负数判断以及赋值都不同。
3.注意231,在python中应该是:2**31。
4.python中求余数和除法:
除法为’ / ',结果是浮点型,所以需要加int转化。求余数用 ‘ % ’。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值