力扣每日一题2022-03-02困难题:寻找最近的回文数

寻找最近的回文数

    • 题目描述
    • 思路
      • 模拟
        • Java实现
        • Python实现


题目描述

寻找最近的回文数


思路

模拟

对于构造回文,最直接的思路就是做前后替换,对于回文数来说,将低位的数替换为对应的高位的数,这样的得到的回文数与原数较接近。对于大多数情况而言,这就能满足题目要求了。
但是对于如19这样的数和示例中的1这样的数,这样还是不满足条件的。以19为例,如果按照上述思路构造,则回文数为11,但显然回文数22离19更近。以1为例,如果按照上述思路,构造出来的是1本身,但这不符合题意。以99321为例,如果按照上述思路,构造出来的回文数为99399,但是显然99299离原数更近。
所以可以进行如下分类讨论:

  • 构造出的回文数与原数相等时,根据题目要求,排除该回文数,找其他可能结果。
  • 构造出的回文数比原数大时,可以尝试减小该回文数的中间部分来缩小回文数和原数的差距。
  • 构造出的回文数比原数小时,可以尝试增加该回文数的中间部分来缩小回文数和原数的差距。
Java实现
class Solution {
    public String nearestPalindromic(String n) {
        long selfNumber = Long.parseLong(n), ans = -1;
        List<Long> candidates = getCandidates(n);
        for (long candidate : candidates) {
            if (candidate != selfNumber) {
                if (ans == -1 ||
                    Math.abs(candidate - selfNumber) < Math.abs(ans - selfNumber) ||
                    Math.abs(candidate - selfNumber) == Math.abs(ans - selfNumber) && candidate < ans) {
                    ans = candidate;
                }
            }
        }
        return Long.toString(ans);
    }

    public List<Long> getCandidates(String n) {
        int len = n.length();
        List<Long> candidates = new ArrayList<Long>() {{
            add((long) Math.pow(10, len - 1) - 1);
            add((long) Math.pow(10, len) + 1);
        }};
        long selfPrefix = Long.parseLong(n.substring(0, (len + 1) / 2));
        for (long i = selfPrefix - 1; i <= selfPrefix + 1; i++) {
            StringBuffer sb = new StringBuffer();
            String prefix = String.valueOf(i);
            sb.append(prefix);
            StringBuffer suffix = new StringBuffer(prefix).reverse();
            sb.append(suffix.substring(len & 1));
            String candidate = sb.toString();
            candidates.add(Long.parseLong(candidate));
        }
        return candidates;
    }
}
Python实现
class Solution:
    def nearestPalindromic(self, n: str) -> str:
        m = len(n)
        candidates = [10 ** (m - 1) - 1, 10 ** m + 1]
        selfPrefix = int(n[:(m + 1) // 2])
        for x in range(selfPrefix - 1, selfPrefix + 2):
            y = x if m % 2 == 0 else x // 10
            while y:
                x = x * 10 + y % 10
                y //= 10
            candidates.append(x)

        ans = -1
        selfNumber = int(n)
        for candidate in candidates:
            if candidate != selfNumber:
                if ans == -1 or \
                        abs(candidate - selfNumber) < abs(ans - selfNumber) or \
                        abs(candidate - selfNumber) == abs(ans - selfNumber) and candidate < ans:
                    ans = candidate
        return str(ans)

你可能感兴趣的:(leetcode每日一题,leetcode)