[LeetCode] 866. Prime Palindrome 质数回文数



Find the smallest prime palindrome greater than or equal to N.html

Recall that a number is prime if it's only divisors are 1 and itself, and it is greater than 1. git

For example, 2,3,5,7,11 and 13 are primes.github

Recall that a number is a palindrome if it reads the same from left to right as it does from right to left. less

For example, 12321 is a palindrome.函数

Example 1:优化

Input: 6
Output: 7

Example 2:code

Input: 8
Output: 11

Example 3:htm

Input: 13
Output: 101

Note:blog

  • 1 <= N <= 10^8
  • The answer is guaranteed to exist and be less than 2 * 10^8.



这道题给了咱们一个整数N,让找一个大于等于N的回文质数,既要求是质数,又要求是回文数。其实这道题能够看成两道题揉到了一块儿,判断质数和回文数分别能够看成单独的题。没想太多,博主上来就准备暴力搜索,先写两个子函数,分别用来判断质数和回文数,而后就直接从N开始搜索了,对每一个数字都分别调用判断质数和回文数的子函数,若都知足,则返回该数便可。理想是丰满的,现实是骨感的,OJ 教你作人系列之 TLE 超时!想着优化一下吧,直接跳过全部的偶数吧(2除外),仍是跪。看来小优化是行不通,得大改。leetcode

问题出如今哪里了呢?确定是判断质数和回文数的子函数太占时间了,怎么优化呢?对于质数来讲,很是的不规则,没有太好的办法来直接组成质数,而是须要经过验证来看其是否为质数。而回文数就不同的,很是的有特色,咱们能够直接按规律来组成回文数,而不是对每一个数字都进行验证,这样的话就至关于去掉了验证回文数的步骤,是一个至关大的提高。怎么拼接呢?因为给了N的取值范围,咱们能够遍历前一半的全部数字,而后翻转一下,组成后一半,两个拼起来就是回文数了。但问题又来了,回文数的长度是分奇偶的,长度为奇数的回文数,最中间的数字是没有对应的,肿么办?其实这道题挺考数学知识的,用到了一个比较偏门的定理,就是全部长度为偶数的回文数字必定是 11 的倍数。博主表示从没听过这个定理,证实过程请参见 lee215 大神的帖子。经过这个定理,能够知道除了11以外,全部长度为偶数的回文数都不是质数,那么当N为 [8, 11] 中的数字时,才会返回11,这个就当 corner cases 提早判断了,对于其余全部的都是符合规律的。那就能够只组奇数的回文数了,因为N的范围是 [1, 1e8],因此前一半范围是 [1, 1e5),由于还包含了最中间的那个数字,因此在翻转以后,记得要把第一位数字去掉,由于最中间的数字只能保留一个,而后把两个数字拼接起来。此时再判断这个拼接后的数字是否大于等N,而且是不是质数,都知足的话返回这个数字便可,参见代码以下:


class Solution {
public:
    int primePalindrome(int N) {
        if (N >= 8 && N <= 11) return 11;
        for (int i = 1; i < 1e5; ++i) {
            string s = to_string(i), t(s.rbegin(), s.rend());
            int x = stoi(s + t.substr(1));
            if (x >= N && isPrime(x)) return x;
        }
        return -1;
    }
    bool isPrime(int num) {
        if (num < 2 || num % 2 == 0) return num == 2;
        int limit = sqrt(num);
        for (int i = 3; i <= limit; ++i) {
            if (num % i == 0) return false;
        }
        return true;
    }
};



Github 同步地址:

https://github.com/grandyang/leetcode/issues/866



相似题目:

Palindrome Number

Count Primes



参考资料:

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

https://leetcode.com/problems/prime-palindrome/discuss/146798/Search-Palindrome-with-Odd-Digits



LeetCode All in One 题目讲解汇总(持续更新中...)

相关文章
相关标签/搜索