纳米AI LeetCode 564.寻找最近的回文数 public String nearestPalindromic(String n)
这是 LeetCode 第 564 题《寻找最近的回文数》核心是找到与给定字符串n数值最接近的回文数若存在距离相同的情况则返回较小的那个。以下是完整的分析和高效解决方案一、问题核心规则回文数定义正读和反读完全相同的数如121、1331若存在两个回文数与n距离相同返回数值更小的那个输入n是长度为 1~18 位的字符串需处理大数避免整数溢出二、关键思路分析直接遍历所有可能的数寻找最近回文数效率极低尤其对于18位大数最优解法是生成所有候选回文数然后在候选集中筛选最优解候选回文数的生成规则我们只需要生成5个关键候选即可覆盖所有可能的最优解比n位数少1的最大回文数如n1000候选为999比n位数多1的最小回文数如n999候选为1001用n的前半部分生成的回文数如n12345前半部分是123生成12321n1234前半部分是12生成1221用n的前半部分1生成的回文数如n12345生成12421n199生成202用n的前半部分-1生成的回文数如n12345生成12221n100生成99三、完整可运行代码classSolution{publicStringnearestPalindromic(Stringn){longnumLong.parseLong(n);intlenn.length();// 生成所有候选回文数SetLongcandidatesnewHashSet();// 1. 位数少1的最大回文数如1000→999candidates.add((long)Math.pow(10,len-1)-1);// 2. 位数多1的最小回文数如999→1001candidates.add((long)Math.pow(10,len)1);// 3. 用前半部分生成基础回文数longprefixLong.parseLong(n.substring(0,(len1)/2));for(longiprefix-1;iprefix1;i){longcandidategeneratePalindrome(i,len%20);candidates.add(candidate);}// 移除自身如果n本身是回文数candidates.remove(num);// 寻找最优解longclosest-1;for(longcand:candidates){if(closest-1){closestcand;}else{longdiffCandMath.abs(cand-num);longdiffClosestMath.abs(closest-num);if(diffCanddiffClosest){closestcand;}elseif(diffCanddiffClosest){// 距离相同选较小的closestMath.min(closest,cand);}}}returnString.valueOf(closest);}// 根据前缀生成回文数privatelonggeneratePalindrome(longprefix,booleanisEven){longpalindromeprefix;// 偶数长度直接反转前缀拼接奇数长度反转前缀去掉最后一位if(!isEven){prefix/10;}while(prefix0){palindromepalindrome*10prefix%10;prefix/10;}returnpalindrome;}}四、关键细节解释1. 大数处理安全警告输入n最大为18位超过Integer.MAX_VALUE约2e9必须用long类型存储避免溢出2. 候选生成逻辑候选类型生成方式示例少一位最大回文10^(len-1) -1len4 → 999多一位最小回文10^len 1len3 → 1001前缀生成回文取前半部分反转拼接n12345 → 前缀123 → 12321前缀1生成回文前半部分1后反转拼接n12345 → 124 → 12421前缀-1生成回文前半部分-1后反转拼接n12345 → 122 → 122213. 最优解筛选先比较与原数的绝对值差差小的优先若差相等选择数值更小的回文数五、边界测试用例// 测试用例1n本身是回文数System.out.println(newSolution().nearestPalindromic(121));// 输出111或131距离相同选小的// 测试用例2n是10的幂System.out.println(newSolution().nearestPalindromic(1000));// 输出999// 测试用例3n是999System.out.println(newSolution().nearestPalindromic(999));// 输出1001// 测试用例4n是18位大数System.out.println(newSolution().nearestPalindromic(999999999999999999));// 输出1000000000000000001六、下一步建议可以尝试手动模拟generatePalindrome方法的执行过程理解回文数生成逻辑思考如何处理输入为1这种极端短字符串的情况候选为0和11最终返回0以上内容由AI搜集并生成仅供参考