当前位置: 首页 > news >正文

纳米AI LeetCode 564.寻找最近的回文数 public String nearestPalindromic(String n)

这是 LeetCode 第 564 题《寻找最近的回文数》,核心是找到与给定字符串n数值最接近的回文数,若存在距离相同的情况则返回较小的那个。以下是完整的分析和高效解决方案:


一、问题核心规则

  1. 回文数定义:正读和反读完全相同的数(如1211331
  2. 若存在两个回文数与n距离相同,返回数值更小的那个
  3. 输入n是长度为 1~18 位的字符串,需处理大数避免整数溢出

二、关键思路分析

直接遍历所有可能的数寻找最近回文数效率极低(尤其对于18位大数),最优解法是生成所有候选回文数,然后在候选集中筛选最优解:

候选回文数的生成规则

我们只需要生成5个关键候选即可覆盖所有可能的最优解:

  1. n位数少1的最大回文数:如n=1000,候选为999
  2. n位数多1的最小回文数:如n=999,候选为1001
  3. n的前半部分生成的回文数:如n=12345,前半部分是123,生成12321n=1234,前半部分是12,生成1221
  4. n的前半部分+1生成的回文数:如n=12345,生成12421n=199,生成202
  5. n的前半部分-1生成的回文数:如n=12345,生成12221n=100,生成99

三、完整可运行代码

classSolution{publicStringnearestPalindromic(Stringn){longnum=Long.parseLong(n);intlen=n.length();// 生成所有候选回文数Set<Long>candidates=newHashSet<>();// 1. 位数少1的最大回文数(如1000→999)candidates.add((long)Math.pow(10,len-1)-1);// 2. 位数多1的最小回文数(如999→1001)candidates.add((long)Math.pow(10,len)+1);// 3. 用前半部分生成基础回文数longprefix=Long.parseLong(n.substring(0,(len+1)/2));for(longi=prefix-1;i<=prefix+1;i++){longcandidate=generatePalindrome(i,len%2==0);candidates.add(candidate);}// 移除自身(如果n本身是回文数)candidates.remove(num);// 寻找最优解longclosest=-1;for(longcand:candidates){if(closest==-1){closest=cand;}else{longdiffCand=Math.abs(cand-num);longdiffClosest=Math.abs(closest-num);if(diffCand<diffClosest){closest=cand;}elseif(diffCand==diffClosest){// 距离相同选较小的closest=Math.min(closest,cand);}}}returnString.valueOf(closest);}// 根据前缀生成回文数privatelonggeneratePalindrome(longprefix,booleanisEven){longpalindrome=prefix;// 偶数长度:直接反转前缀拼接;奇数长度:反转前缀去掉最后一位if(!isEven){prefix/=10;}while(prefix>0){palindrome=palindrome*10+prefix%10;prefix/=10;}returnpalindrome;}}

四、关键细节解释

1. 大数处理

安全警告:
输入n最大为18位,超过Integer.MAX_VALUE(约2e9),必须用long类型存储,避免溢出

2. 候选生成逻辑

候选类型生成方式示例
少一位最大回文10^(len-1) -1len=4 → 999
多一位最小回文10^len +1len=3 → 1001
前缀生成回文取前半部分,反转拼接n=12345 → 前缀123 → 12321
前缀+1生成回文前半部分+1后反转拼接n=12345 → 124 → 12421
前缀-1生成回文前半部分-1后反转拼接n=12345 → 122 → 12221

3. 最优解筛选

  • 先比较与原数的绝对值差,差小的优先
  • 若差相等,选择数值更小的回文数

五、边界测试用例

// 测试用例1:n本身是回文数System.out.println(newSolution().nearestPalindromic("121"));// 输出111(或131,距离相同选小的)// 测试用例2:n是10的幂System.out.println(newSolution().nearestPalindromic("1000"));// 输出999// 测试用例3:n是999System.out.println(newSolution().nearestPalindromic("999"));// 输出1001// 测试用例4:n是18位大数System.out.println(newSolution().nearestPalindromic("999999999999999999"));// 输出1000000000000000001

六、下一步建议

  1. 可以尝试手动模拟generatePalindrome方法的执行过程,理解回文数生成逻辑
  2. 思考如何处理输入为"1"这种极端短字符串的情况(候选为011,最终返回0
    以上内容由AI搜集并生成,仅供参考
http://www.jsqmd.com/news/489001/

相关文章:

  • OpenClaw 超级 AI 实战专栏【模型推理与实战】(五)推理参数调优:精度、速度、显存平衡
  • 2026年口碑好的小型发酵饲料设备工厂推荐:固态发酵饲料设备/智能发酵饲料设备工厂直供推荐 - 品牌宣传支持者
  • WuliArt Qwen-Image Turbo避坑指南:解决黑图、显存不足等常见问题
  • 2025_NIPS_Praxis-VLM: Vision-Grounded Decision Making via Text-Driven Reinforcement Learning
  • UniG2U-Bench 论文解读:统一多模态模型真的提升了视觉理解吗?
  • OBS怎么调美颜?OBS怎么打开美颜功能?
  • 新媒体内容创作:使用DeOldify为历史题材短视频生成彩色素材
  • SciDER:当AI学会从原始数据开始做科研,GPT-5也得靠边站
  • vim使用verible插件进行verilog语法检查
  • MTP管理培训
  • 【Altium】解决Database连接报错问题
  • python常用库的学习
  • Nacos 3.0新特性解析:为什么控制台端口独立为8080?
  • ROS2 -03-工作空间与功能包
  • Symbol数据类型:特性解析与实战应用
  • C语言文件操作实战:读写二进制图片数据调用DeOldify服务
  • ROS2功能包构建与文件结构解析:从colcon编译到项目部署
  • Pytorch之torch.nn.Conv2d详解
  • 基于STC8H8K64U的光学仪器协同采集平台设计
  • OSPF与ISIS的区别
  • C#连接MySQL数据库报错排查:从SslMode=None到安全连接实践
  • Swift构造过程介绍
  • Swift 函数基础
  • 8元搞定Cursor永久账号:手把手教你用域名邮箱绕过限制(附Spaceship购买教程)
  • 以太网详解(七)TCP/IP四层模型与协议栈实战
  • PDSC文件详解:如何为你的MDK软件包编写完美的XML描述
  • Flux Sea Studio 海景摄影生成工具:Agent智能体架构设计——打造自主规划与迭代的海景创作智能体
  • CH552P低成本测温风扇控制器设计
  • OFA-iic/ofa_visual-entailment_snli-ve_large_en保姆级教程:开箱即用GPU推理全流程
  • JS 实现前端给图片加水印 及 叠加图片