每天一更 Leecode每日一题--Reverse

题目 reverse

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

示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题:

暴 力 破 解 法 : \color{#4285f4}{暴力破解法:} :

看到题的第一眼是蒙的…不得不说还是学渣啊…
镇定下来开始仔细看题,有符号无符号,c语言学过,python里的整数和C语言类似,有 ( 无 符 号 ) \color{green}{(无符号)} () ( 有 符 号 ) \color{green}{(有符号)} ()之分,题中明确给出的是32 位的有符号整数,按这道题来理解就是带不带正负号的整数。其实这道题没有那么复杂的思想,就是正数还是负数。
再接着审题的时候发现有个词叫整数溢出,有点不理解就百度了一下结合一些大神给出的理解,用人话翻译了一下。
整 数 溢 出 : \color{red}{整数溢出:} 所有数存在内存里是有固定的长度的,所以数的取值是有范围的,当数的取值超过所给定的范围时,就会从起点开始重新再计数,这个就叫整数溢出。
例子:用带计数的跳绳运动时,计数器最高是999,当跳绳超过999时,就会清零重新计数,总数就是999+计数器的数。
题目中已经给出取值范围为[ − 2 31 −2^{31} 231, 2 31 − 1 2^{31} − 1 2311],而且说明如果反转后整数溢出那么就返回 0,用if条件做出判断就可以。

return x if -2147483648 < x < 2147483647 else 0  # 判断有没有整数溢出

接下来就是这题完整代码


class Solution:
    def reverse(self, x: int):
        if -10 < x < 10:  # 判断是否是个位数 个位数不用反转
            return x
        str_x = str(x)  # 将整数x转为字符型
        if str_x[0] == '-':  # 判断x是否为负数
            str_x = str_x[1:][::-1]  # 是负数,从字符串第一个位置开始取值(去掉符号),把数翻转
            x = int(str_x)
            x = -x
        else:
            str_x = str_x[::-1]  # 不是负数直接反转即可
            x = int(str_x)
        return x if -2147483648 < x < 2147483647 else 0  # 判断有没有整数溢出

这段代码基本分为三个部分:

  1. 判断x是否是个位数
  2. 判断x是正数还是负数
  3. 判断是否正数溢出

第一次看这个代码的时候可以从后往前看 3-1-2

其中用的方法是python很基础的东西 字符串的切片操作
在这里插入图片描述


加 算 法 : \color{#4285f4}{加算法:} :

官方解释

方法:弹出和推入数字 & 溢出前进行检查

算法

反转整数的方法可以与反转字符串进行类比。

我们想重复“弹出” x x x 的最后一位数字,并将它“推入”到 rev 的后面。最后,rev 将与 x x x 相反。

要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法。

作者:LeetCode
链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

待我用人话解释一下
就是算法里的 出 栈 和 入 栈 \color{red}{出栈和入栈} ,栈是什么,这么想就是竖过来的列表,最先进来的就在下面,后进来的在上面。(可能不太准确)
x x x就是给的数, r e v rev rev是用来保存经过计算后被弹出的数,实际上就是反转后的数
给个例子就理解了:
给的数是123,那么 x = 123 x=123 x=123,

rev = 0
while x != 0:
	rev = rev*10 + x%10
    x = x//10
    print(rev, x)

把123带进去算一遍,就能理解rev和 x x x的作用分别是什么了
rev和x
运行结果图
完整代码:

class Solution:
    def reverse(self, x: int) -> int:
        if -10 < x < 10:    # 判断是否是个位数 个位数不用反转
            return x
        flat = 1   # 正数标记为1
        if x < 0:   # 如果x是负数,将x转为正数,方便计算
            flat = -1   # 负数标记为-1
            x = flat * x
        # 算是算法吧
        rev = 0
        while x != 0:
            rev = rev*10 + x%10
            x = x//10
        rev = rev * flat   # 上面将负数转为了正数,现在变回负数输出
        return rev if -2147483648 < rev < 2147483647 else 0    # 判断有没有整数溢出

算法结果为了尊重原创,还是贴一下我看到其代码后理解了官方解题思路
https://www.jianshu.com/p/ba7b6564a503


总结

说实话,第二部分真不想写,因为真心觉得python切片就已经很简单了,但是抱着学习的态度,还是得学啊,阿西吧。

第二天
over

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值