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

题目

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);
    }
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值