<LeetCode天梯>Day016 整数反转(暴力求解+直接反转) | 初级算法 | Python

💖作者简介:大家好,我是车神哥,府学路18号的车神🥇

📝个人主页:应无所住而生其心的博客_府学路18号车神_CSDN博客
🎉点赞评论收藏 == 养成习惯(一键三连)😋
📖本系列主要以刷LeetCode力扣)网站的各类题为标准,实现自我能力的提升为目标⚡
⚡希望大家多多支持🤗~一起加油 😁

周三,xdm,北京今天热起来了还,好久没出去玩了,哎!疫情尽快结束吧!疫情依旧反复,大家带好口罩啊~ 继续继续,来,今天和车神哥一起来提升自己的Python编程和面试能力吧,刷天梯~

以下为我的天梯积分规则

每日至少一题:一题积分+10分
若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)
若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60


初始分为100分
若差一天没做题,则扣积分-10分(周六、周日除外注:休息
坚持!!!


初级算法

刷题目录

字符串

在这里插入图片描述

题干

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [ − 2 31 −2^{31} 231, 2 31 2^{31} 231 − 1] ,就返回 0。

示例1:

输入:x = 123
输出:321

示例2:

输入:x = -123
输出:-321

示例3:

输入:x = 120
输出:21

示例4:

输入:x = 0
输出:0


暴力反转

分析:

我们的数字长度可能超过32位,也可能不超过,则设置两个条件;由于是有符号的数,那我们符号得保留下来,仅对数字进行反转,符号不变。
我们可以将数字转换为字符串单个字符放在数组里面,然后再进行上一题的转换,这样就没毛病了。

class Solution:
    def reverse(self, x: int) -> int:
        t = list(str(x))  # 将数字转换成字符数组
        # t = list(map(str, str(x)))
        n = len(t)
        left = n-1
        right = 1
        right2 = 0
        if t[0] == '-':
            for i in range((n-1)//2):
                t[right], t[left] = t[left], t[right]
                right += 1
                left -= 1
            tt = int(''.join(t))
            if tt <= (2**31-1) and tt >= (-2**31):
                return tt
            else:
                return 0
        else:
            if n == 1:
                return x
            else: 
                for j in range(n//2):
                    t[right2], t[left] = t[left], t[right2]
                    right2 += 1
                    left -= 1
                tt = int(''.join(t))
                if  tt<= (2**31-1) and tt >= (-2**31):
                    return tt
                else:
                    return 0

感觉这个办法很笨,也很慢,我们还需要再优化优化
在这里插入图片描述

直接反转

数字嘛,我们针对数字那就直接反转,个位十位百位千位嘛,就是系数乘以10的倍数呗、我们只需要将个位变为最高位,十位变为第二高位,以此类推,这样会快一些。首先判断是否为0,否则返回0.还得判断是否为负数,如果为负数则先统一为正,然后再添上符号。

引用一下大佬的图片

在这里插入图片描述

class Solution:
    def reverse(self, x: int) -> int:
	flag = False   # 设置标识符
	        if x < 0:      # 判断正负
	            flag = True
	        x = abs(x)     # 绝对值化
	        res = 0        # 设置初值
	        while x != 0:  
	            res *= 10  # 加权移位
	            temp = x % 10   # 取余
	            x //= 10    # 地板除
	            res += temp  # 赋值
	        if flag:        # 回归负
	            res = 0 - res
	            if res < 0 - 2 ** 31:
	                return 0
	        if res > 2 ** 31 - 1:  # 正值
	            return 0
	        return res

在这里插入图片描述

速度有所提升,但内存消耗没有上面的表现的好,感觉和我第一个的方法差不多,哎!~

加油吧!~

References

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnx13t/
来源:力扣(LeetCode)

作者:数据结构和算法
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnx13t/?discussion=ukHfZx
来源:力扣(LeetCode)


今日得分:+10 +10
总得分:370 (后面两种走捷径的方法就不加分了今天,哈哈)

加油!!!

❤坚持读Paper,坚持做笔记,坚持学习,坚持刷力扣LeetCode❤!!!
坚持刷题!!!打天梯!!!
To Be No.1

⚡⚡


创作不易⚡,过路能❤关注收藏点个赞三连就最好不过了

ღ( ´・ᴗ・` )


明明付出远高于回报,却依旧选择硬着头皮做下去。只为了能在还未触及到的未来帮到你。或许这就是傻白甜吧。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

府学路18号车神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值