本文主要是介绍LeetCode 564. 寻找最近的回文数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:
力扣https://leetcode-cn.com/problems/find-the-closest-palindrome/
【分析】这道题要求找到和原数字绝对差值最小的回文数,我们很自然的想到保留高位改变低位,也就是把前半部分折叠过来。也就是把abcde变成abcba,但是如果本身就是回文串这样折叠过来还是自身。所以要考虑把(abc-1)或者(abc+1)折叠。但是对于99999这种的,生成的会是1000001和99899,但实际最接近的是100001;对于10001这种的生成的是10101和999,实际最小是9999,所以对于长度为n的数还要考虑10^n+1和10^(n-1)-1。
class Solution {public String nearestPalindromic(String n) {int m = n.length();long org = Long.parseLong(n);Set<Long> set = new HashSet<>();set.add((long)Math.pow(10, m - 1) - 1);set.add((long)Math.pow(10, m) + 1);long mid = Long.parseLong(n.substring(0, (m + 1) / 2));for(long i = mid -1; i <= mid + 1; i++){StringBuilder sb = new StringBuilder();StringBuilder pre = new StringBuilder(String.valueOf(i));sb.append(pre);if(m % 2 == 0) sb.append(pre.reverse());else sb.append(pre.reverse().substring(1));set.add(Long.parseLong(sb.toString()));}long ans = -1;for(Long i: set){if(i == org) continue;if(ans == -1) ans = i;else if(Math.abs(i - org) < Math.abs(ans - org)) ans = i;else if(Math.abs(i - org) == Math.abs(ans - org) && i < ans) ans = i;}return String.valueOf(ans);}
}
这篇关于LeetCode 564. 寻找最近的回文数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!