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

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

以下为我的天梯积分规则:


每日至少一题:一题积分+10分

若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)

若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)


初始分为100分

若差一天没做题,则扣积分-10分(周六、周日除外注:休息)

坚持!!!


初级算法

刷题目录

字符串


image.png

image.png

题干

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


如果反转后整数超过 32 位的有符号整数的范围 [− 2 31 −2^{31}−2

31

, 2 31 2^{31}2

31

 − 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

感觉这个办法很笨,也很慢,我们还需要再优化优化

image.png

直接反转

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


引用一下大佬的图片

image.png

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

image.png


相关文章
|
存储
LeetCode整数反转
解决LeetCode上的整数反转问题的几种方法,包括错误的方法和优化后的解决方案,以及如何避免反转后的整数超出32位有符号整数范围的问题。
132 1
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
152 6
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
323 2
【LeetCode】整数翻转
【LeetCode】整数翻转
63 1
|
存储 C++
Leetcode第十二题(整数转罗马数字)
LeetCode第12题“整数转罗马数字”的解题方法,包括罗马数字的基本规则和特殊规则,以及如何使用C++实现整数到罗马数字的转换。
102 0
|
C++
Leetcode第十三题(罗马数字转整数)
这篇文章介绍了LeetCode第13题“罗马数字转整数”的解题方法,通过一个C++的类`Solution`中的`romanToInt`函数来实现,该函数使用哈希表和遍历字符串的方法,根据罗马数字的规则将输入的罗马数字字符串转换为对应的整数值。
163 0
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
143 0
LeetCode第12题目整数转罗马数字
该文章介绍了 LeetCode 第 12 题整数转罗马数字的解法,通过使用 TreeMap 按照整数从大到小排序,先使用大的罗马数字表示整数,再用小的,核心是先表示完大的罗马数字,想通此点该题较简单。
LeetCode第12题目整数转罗马数字
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)
LeetCode第7题整数反转
该文章介绍了 LeetCode 第 7 题整数反转的解法,通过除 10 取模和乘 10 累加的方式实现整数反转,同时注意边界情况的判断,并总结了通过举例推算发现规律的解题思路。
LeetCode第7题整数反转

热门文章

最新文章

推荐镜像

更多