力扣练习——整数反转&回文数字(python)


由于这两道题采用相同的思路,所以放在一起写。

回文数

问题描述

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 示例 1:
    输入: 121
    输出: true
  • 示例 2:
    输入: -121
    输出: false
    解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
  • 示例 3:
    输入: 10
    输出: false
    解释: 从右向左读, 为 01 。因此它不是一个回文数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number

思路

首先将数字换变为字符串,把字符串的每个字符放在一个列表中。然后生成一个新列表,列表各元素是前一个列表的倒序,如果这两个列表相等,则该数字是回文数。

官方提示是:Beware of overflow when you reverse the integer.
我看不懂这个提示…

代码及结果

代码

class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        ls_1=list(str(x))
        ls_2=[]
        for i in range(len(ls_1)-1,-1,-1):
            ls_2.append(ls_1[i])
        if ls_1 == ls_2 :
            return True
        else:
            return False

结果

执行用时 :64 ms, 在所有 python 提交中击败了51.26%的用户
内存消耗 :11.7 MB, 在所有 python 提交中击败了25.86%的用户

整数反转

问题描述

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

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

PS:再次注意是反转后整数溢出)

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer

思路

和回文数字用到的方法一样,同样用两个列表来解决。但是存在以下问题:

  1. 储存反转后的列表如何转换成整数
  2. 判断给定数字是否为负的条件放在哪里
  3. 何时应该return 0

代码及结果

代码

class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x < 0:
            a= -x
        else:
            a=x
        ls_1=list(str(a))
        ls_2=[]
        for i in range (len(ls_1)-1, -1, -1):
            ls_2.append(ls_1[i])
        ls=''.join(ls_2)

        if int(ls) <= -2 **31 or int(ls) >= 2**31-1 :
            return 0
        if x > 0:
            return int(ls)
        else :
            return -int(ls)

结果

执行用时 :16 ms, 在所有 python 提交中击败了93.27%的用户
内存消耗 :11.6 MB, 在所有 python 提交中击败了35.12%的用户

用时很短比较出乎意料。与移除元素那个问题结合起来可以发现,检索列表用时很短,但是增删列表需要花不少时间(具体原因需要进一步的学习)。

总结

  1. 关于正负数:python中的abs()函数可以获得一个数的绝对值。
  2. 关于列表转换成整数:需要用"".join() 函数。括号里是列表,“”中如果没有则是将列表中所有元素连起来,如果是某字符,则将是将所有元素用该字符连起来。
  3. 还可以用列表的reverse函数来做:

回文数

class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        if x < 0:
            return False
        ls=list(str(x))
        ls.reverse()
        y=int(''.join(ls))
        if x == y:
            return True
        else:
            return False

结果:
执行用时 :68 ms, 在所有 python 提交中击败了41.89%的用户
内存消耗 :11.7 MB, 在所有 python 提交中击败了26.87%的用户

整数反转

class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        if x < 0:
            return False
        ls=list(str(x))
        ls.reverse()
        y=int(''.join(ls))
        if x == y:
            return True
        else:
            return False

结果:
执行用时 :12 ms, 在所有 python 提交中击败了98.12%的用户
内存消耗 :11.7 MB, 在所有 python 提交中击败了23.86%的用户

从结果上比较两种方法差别不大,但reverse写起来更方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值