leetcode 866. Prime Palindrome | 866. 回文素数

x33g5p2x  于2022-07-04 转载在 其他  
字(1.7k)|赞(0)|评价(0)|浏览(245)

题目

https://leetcode.com/problems/prime-palindrome/

题解

参考了答案:https://leetcode.com/problems/prime-palindrome/solution/

自己实现的时候,我把奇数位回文串和偶数位回文串拆开来了,最后去返回两种回文串当中的最小值,觉得这样更严谨,尽管这种严谨可以被数学证明是没有必要的。因为如果位数不同的话,结果的大小不是单调增的,不应该直接return。

例如,因为如果先算奇数,再算偶数的话,奇数是比偶数少一位的,这样有可能返回错误的最小值:

1002001	(假设它是false)
10022001(假设它是false)
1003001	(假设它是false)
10033001(假设它是true,直接返回了,是错误的最小值)
1004001	(假设它是true,这才是真正的最小值)

至于答案这样写为什么没有问题,是因为 All palindrome with even digits is multiple of 11. 相当于大于 11 的偶数都会返回 false,不会造成上述例子中返回 10033001 的情况。

class Solution {
    public int primePalindrome(int n) {
        if (n == 1) return 2;

        long even = primePalindromeEven(n);
        long odd = primePalindromeOdd(n);
        return (int) Math.min(even, odd);
    }

    public long primePalindromeEven(int n) {
        for (int L = 1; L <= 5; L++) { // 回文root的位数L
            for (int root = (int) Math.pow(10, L - 1); root < Math.pow(10, L); root++) { // 遍历位数为L的所有回文root
                // 偶数位回文串
                StringBuilder sb = new StringBuilder(String.valueOf(root));
                for (int i = L - 1; i >= 0; i--) {
                    sb.append(sb.charAt(i));
                }
                long num = Long.parseLong(String.valueOf(sb));
                if (num >= n && isPrime(num)) {
                    return num;
                }
            }
        }
        return Integer.MAX_VALUE;
    }

    public long primePalindromeOdd(int n) {
        for (int L = 1; L <= 5; L++) { // 回文root的位数L
            for (int root = (int) Math.pow(10, L - 1); root < Math.pow(10, L); root++) { // 遍历位数为L的所有回文root
                // 奇数位回文串
                StringBuilder sb = new StringBuilder(String.valueOf(root));
                for (int i = L - 2; i >= 0; i--) {
                    sb.append(sb.charAt(i));
                }
                long num = Long.parseLong(String.valueOf(sb));
                if (num >= n && isPrime(num)) {
                    return num;
                }
            }
        }
        return Integer.MAX_VALUE;
    }

    public boolean isPrime(long n) {
        if (n <= 2) return true;
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (n % i == 0) return false;
        }
        return true;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int i = solution.primePalindrome(9989900);
        System.out.println(i);
    }
}

相关文章