刷题2021-11-08 回文数

这篇博客探讨了如何有效地判断一个整数是否为回文数。首先介绍了基础解决方案,通过转换整数为字符串并比较前半部分与后半部分是否相同。接着提出了进阶思路,包括不转换为字符串的解决方案,通过位运算和除法操作检查回文性。最终展示了一种高效的方法,使用列表切片和反转操作直接比较原始数与逆序数。博客还讨论了不同算法的时间复杂度和内存消耗,并提供了多种实现方式的对比。
摘要由CSDN通过智能技术生成

判断一个整数是不是回文数

题目描述:
来源:力扣(LeetCode)09 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

示例 1:

输入:x = 121
输出:true
示例 2:

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
示例 4:

输入:x = -101
输出:false

进阶
你能不将整数转为字符串来解决这个问题吗?

我的答案:

class Solution:
    def isPalindrome(self, x: int) -> bool:
        str1 = str(x)
        flag = True
        for i in range(0, int(len(str1)/2)):
            if str1[i] != str1[len(str1) - 1 -i]:
                flag = False
                break
        return flag

执行结果:通过

执行用时:56 ms, 在所有 Python3 提交中击败了75.91%的用户
内存消耗:14.7 MB, 在所有 Python3 提交中击败了99.20%的用户
通过测试用例:11510 / 11510

进阶:
我的答案:
思路:先求出整数的位数,然后通过两次for循环用10来除这个数,用end和start来接收高位和地位的数,然后比较start和end是否相等,若不相等就不是回文数

class Solution:
    def isPalindrome(self, x: int) -> bool:
        count = 0
        flag = True
        number = x
        number1 = number
        if number1 < 0:
            flag = False
        while number1 > 0:
            count += 1
            number1 = int(number1/10)

        for i in range(0,count):
            end = number
            start = number
            #通过取余操作后依次获取到从最低位开始的数
            for j in range(0,i):
                end = int(end/10)
            #通过取余操作后依次获取到从最高位开始的数
            for k in range(0,count - 1 - i):
                start = int(start / 10)
            if (start % 10) != (end % 10):
                flag = False
                break
        return flag

改进:
思路:利用一个while循环,用10整除再取余的方法用back_number接收x的逆序的数,最后判断逆序的数与之前的数是否相等

class Solution:
def isPalindrome(self, x: int) -> bool:
    back_number = 0
    number1 = number2 = x
    #如果x是负数,那么就必然不是回环数
    if x < 0:
        return False
     #通过轮询用10整除再取余的方法用back_number接收x的逆序的数
    while number1 > 0:
        back_number = (back_number * 10) + (number1 % 10)
        number1 = int(number1 / 10)
    return x == back_number

大佬答案:
思路:当x>=0和逆序后的x是否相等(用到了列表)
(这个提交击败了60%多的用户,不过是我能找到的最快的了,python区的答案似乎都没有很快的,可能是python的原因,如果哪位大佬有更快的算法,麻烦评论告诉我下,感谢大佬!)

class Solution:
    def isPalindrome(self, x: int) -> bool:
        return x>=0 and int(str(x)[::-1]) == x

对于[::-1]解释:(没看懂,所以去搜了下这段代码的解释)


b = a[i:j]   # 表示复制a[i]到a[j-1],以生成新的list对象
a = [0,1,2,3,4,5,6,7,8,9]
b = a[1:3]   # [1,2]
#当i缺省时,默认为0,即 a[:3]相当于 a[0:3]
#当j缺省时,默认为len(alist), 即a[1:]相当于a[1:10]
#当i,j都缺省时,a[:]就相当于完整复制一份a
b = a[i:j:s]    # 表示:i,j与上面的一样,但s表示步进,缺省为1.
所以a[i:j:1]相当于a[i:j]
#当s<0时,i缺省时,默认为-1. j缺省时,默认为-len(a)-1
#所以a[::-1]相当于 a[-1:-len(a)-1:-1],也就是从最后一个元素到第一个元素复制一遍,即倒序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值