LeetCode每日一题 - 回文数 - 很棒的一道题 - key=lambd x: 巧用

本文详细探讨了如何解决LeetCode上的回文数问题,通过举例分析了不同长度数字转换为回文数的策略。解题思路包括生成上下边界、原数中间截断翻转等方法,并提供了Python实现代码。最后,文章强调了Python在数组操作中的便利性,并鼓励继续学习和积累。
摘要由CSDN通过智能技术生成


前言

  是本篇博客主要记录在LeetCode每日一题中遇到的回文数,这道题好有意思的!下面就记录一下自己的一些收获。


提示:以下是本篇文章正文内容,下面案例可供参考

一、问题描述

  给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。
  “最近的”定义为两个整数差的绝对值最小

  来源:力扣(LeetCode)
  链接:https://leetcode-cn.com/problems/find-the-closest-palindrome/
在这里插入图片描述

二、解题思路及代码

1.解题思路

  举例如输入的 n = “12345” (奇数位)或 “123456”(偶数位) ,则下面列出可能出现的回文数情况:
(1)下限 9999 或 99999 与上限 100001 或 1000001;
(2)中间截断后,倒序输出 12321 或 123321;
(3)截断部分 -1 再倒序输出 12221 或 122221;截断部分 +1 再倒序输出 12421 或 124421;
  搞明白所有的情况后,给个lis表进行存储,而后便进行排序就OK了!

2.程序及注释

代码如下(示例):

class Solution:
    def nearestPalindromic(self, n: str) -> str:
        #一共五种情况 12345
        # 1)前面的一半放到后面     -> 12321
        # 2)前面的一半加1放到后面  -> 12421
        # 3)前面的一半减1放到后面  -> 12221
        # 4)上边界   -> 100001
        # 5)下边界   -> 9999
        l = len(n)
        if l == 1:
            return str(int(n)-1)
        #取前半部分 1234512 123456123 n[:3]返回第一项到第三项
        headSec = n[: l//2 + l%2] 
        minusOne = str(int(headSec) - 1)
        addOne = str(int(headSec) + 1)
        lis = [
            #上下边界    
            '9' * (l-1),'1' + '0'*(l-1) + '1',
            #因而使用n[::-1]倒序输出 [(l//2 - 1)::-1] 如12345取12倒序 123456取123倒序
            headSec  + headSec[(l//2-1)::-1],
            minusOne + minusOne[(l//2-1)::-1],
            addOne   + addOne[(l//2-1)::-1]]
        #key = lambda x : ( abs(int(x)-int(x)) or  2, x)
        #这一步相当于排序 为了排除与自身相等的数字如11 使用(0 or int(n)-> int(n)-1
        #下面就是找最小值的问题了 
        #下面这是两重的判断 先判断 abs(int(x)-int(n)) or int(n) 的最小值 而后在前者的条件下 判断int(x)
        return min(lis,key = lambda x : (abs(int(x)-int(n)) or int(n), int(x)))
        # )

  

三、总结

  这道题的代码想了好久,借鉴了leetCode用户Azusa Tsang的代码,python的许多语句以前都没有好好研究研究,现在每做一道题都要记录一下其中的一些巧妙用法,如:or 的在判断语句中的巧妙应用,key = lambd x:语句的精简明细,尤其是,python在数组方面的 ‘片取’ 太方便了。
  最后,厚积薄发,继续沉淀,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值