LeetCode刷题(python版)-007

题目(英)

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.

题目(中)

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

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

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

示例 3: 输入: 120 输出: 21

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

Solution 1:直接当成数字按位处理

解法1的核心是是利用取余%, 将每一位都取出来。然后再依次放入新生成的数中,最后对新生成的数进行判定。

注意:

  1. 之所以用abs()(取绝对值) 是因为比如:-11 % 10 = 9 而我们要的其实是 -1,所以只能通过abs()-11 转换成 1111 % 10 = 1 最后再把 - 还原。

  2. 利用% 10可以每次把个位数取出来,这样倒序的话就是已经取出来的数*10相当于进位,空出的个位就放新取出来的,这个就有点像队列 - FIFO

  3. /// 的区别:// 是地板除(除完后保留整数部分); / 是正常的除法。比如:10.1 / 2 = 5.05 ; 10.1 // 2 = 5。我们这里用// 10来实现移除最后一位的数字。

  4. 最后的判定,注意看清题目,是对反转后的数字num进行判定,再结合大前提也就是输入x的符号,我们分为三种情况:
    第一种当 x>=0 时,我们需要保证num <= (2**31 - 1), 就是 ^(幂);
    第二种当x < 0时,我们需要保证num <= (2**31), 要注意我们的num不带符号的,因为在最开始我们对x取了绝对值;
    最后就是num超出范围时,直接返回0。

具体代码如下:

class Solution:
    def reverse(self, x: int) -> int:
        num = 0
        a = abs(x)
        while(a != 0):
            temp = a%10
            num = num*10 + temp
            a = a // 10 
        if 0<=x and num <= (2**31-1): return num
        elif 0>x and num <= (2**31) : return -num
        else: return 0

Solution 2:将数字当成字符串处理

解法2的核心是把数字利用str(int)int转换成字符串string,在利用字符串的颠倒进行反转,反转后利用int(string)string转换成整型int。最后利用一个flag实现符号的判定,加上对新生成的数进行范围判定最后输出结果。该方法比解法1要快。

注意:

  1. boolfushu就是我们的flag,为True的时候代表负数

  2. str()是 int -> string
    int()是string -> int

  3. [begin:end:step]step = -1 时是代表逆序,注意beginend是包头不包尾的,也就是数学中的 [begin,end) 或者是 [begin,end-1]。都不写的话默认就是全部的字符串,也就是: begin = 0, end = len(string)

  4. + 是5种字符串连接方法之一,具体可参照链接: link.。join()也比较常用,如果用join()实现的话就是:
    a = '-'
    reverseStrx = a.join(['',reverseStrx])
    或者是:
    a = ''
    reverseStrx = a.join(['-',reverseStrx])
    因为join()只能是连接list,所以还是直接用+方便一些。

  5. 最后判断因为不需要加正负号,所以只判断为零的情况。

具体代码如下:

class Solution:
    def reverse(self, x: int) -> int:
        boolfushu = False
        if x < 0 :
            boolfushu = True
            x = abs(x)
        strx = str(x)
        reverseStrx = strx[::-1]
        if boolfushu == True:
            reverseStrx = '-'+reverseStrx
        intStrx = int(reverseStrx)
        if intStrx < -(2**31) or intStrx > 2**31-1:
            return 0
        return intStrx

总结

  1. 对于有符号的数字运算我们通常都需要用abs()转成正数,避免引起一系列的问题。
  2. 对于数字的处理往往两个思路,一个就当成数字处理,另一个就是转换成字符串再处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值