前言
是本篇博客主要记录在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)
#取前半部分 12345取12 123456取123 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在数组方面的 ‘片取’ 太方便了。
最后,厚积薄发,继续沉淀,加油!