LeetCode 866 - Prime Palindrome


https://leetcode.com/problems/prime-palindrome/
Find the smallest prime palindrome greater than or equal to N.
Recall that a number is prime if it's only divisors are 1 and itself, and it is greater than 1. 
For example, 2,3,5,7,11 and 13 are primes.
Recall that a number is a palindrome if it reads the same from left to right as it does from right to left. 
For example, 12321 is a palindrome. 


Let's investigate and improve on a brute force method.
With basic methods, we can check whether an integer N is a palindrome in O(\log N) time, and check whether it is prime in O(\sqrt{N}) time. So we would probably like to do the palindrome check first.
Now, say we naively check every number N, N+1, \cdots, N+K. How big is K?
Well, the palindromes could be approximately 10^4 apart, since for example 99988999's next palindrome is 99999999.


Say we have a palindrome X. What is the next palindrome?
Each palindrome of d digits has a palindromic root, it's first k = \frac{d+1}{2} digits. The next palindrome is formed by the next root.
For example, if 123 is a root for the 5 digit palindrome 12321, then the next palindrome is 12421 with root 124.
Notice that roots and palindromes are not a bijection, as palindromes 123321 and 12321 have the same root.
Algorithm
For each palindromic root, let's find the two associated palindromes (one with an odd number of digits, and one with an even number.) For roots with k digits, they will generate palindromes of 2*k - 1 and 2*k digits.
If we didn't know that palindromes with an even number of digits (and greater than 11) are never prime, we're still fine - we can just check both possibilities. When checking both possibilities, we check the palindromes with 2k - 1 digits first, as they are all smaller than the palindromes with 2k digits.
We'll use an idea from [LeetCode Problem: Reverse an Integer], in order to check whether an integer is a palindrome. We could have also converted the integer to a string, and checked the indices directly.
As for testing primes with isPrime(N), we'll use the standard O(\sqrt{N}) check: testing whether every number \leq \sqrt{N} is a divisor of N.
  • Time Complexity: Based on our analysis above, we performed on the order of O(N) operations (not counting log factors from dealing with integers), given we knew the existence of prime palindrome 100030001.
    Interestingly, the time complexity is an open problem in mathematics, as it is not even known whether there are infinitely many prime palindromes, or whether palindromes behave as random integers for our purposes here - see ["Almost All Palindromes are Composite"] for more.
  • Space Complexity: O(\log N), the space used by s (or sb in Java.) 

  public int primePalindrome(int N) {
    for (int L = 1; L <= 5; ++L) {
      // Check for odd-length palindromes
      for (int root = (int) Math.pow(10, L - 1); root < (int) Math.pow(10, L); ++root) {
        StringBuilder sb = new StringBuilder(Integer.toString(root));
        for (int k = L - 2; k >= 0; --k)
          sb.append(sb.charAt(k));
        int x = Integer.valueOf(sb.toString());
        if (x >= N && isPrime(x))
          return x;
        // If we didn't check for even-length palindromes:
        // return N <= 11 ? min(x, 11) : x
      }

      // Check for even-length palindromes
      for (int root = (int) Math.pow(10, L - 1); root < (int) Math.pow(10, L); ++root) {
        StringBuilder sb = new StringBuilder(Integer.toString(root));
        for (int k = L - 1; k >= 0; --k)
          sb.append(sb.charAt(k));
        int x = Integer.valueOf(sb.toString());
        if (x >= N && isPrime(x))
          return x;
      }
    }

    throw null;
  }

  public boolean isPrime(int N) {
    if (N < 2)
      return false;
    int R = (int) Math.sqrt(N);
    for (int d = 2; d <= R; ++d)
      if (N % d == 0)
        return false;
    return true;

  }



Our brute force works except when N is 8 digits (as explained in Approach Framework when we established that all 8 digit palindromes are not prime), so we can skip all 8 digit numbers.
For each number, check whether it is a palindrome. If it is, check whether it is a prime. If the number is 8 digits, skip to the 9 digit numbers.
  public int primePalindrome(int N) {
    while (true) {
      if (N == reverse(N) && isPrime(N))
        return N;
      N++;
      if (10_000_000 < N && N < 100_000_000)
        N = 100_000_000;
    }
  }

  public boolean isPrime(int N) {
    if (N < 2)
      return false;
    int R = (int) Math.sqrt(N);
    for (int d = 2; d <= R; ++d)
      if (N % d == 0)
        return false;
    return true;
  }

  public int reverse(int N) {
    int ans = 0;
    while (N > 0) {
      ans = 10 * ans + (N % 10);
      N /= 10;
    }
    return ans;
  }

https://leetcode.com/problems/prime-palindrome/discuss/146798/Search-Palindrome-with-Even-Digits
All palindrome with even digits is multiple of 11.
We can prove as follow:
11 % 11 = 0
1111 % 11 = 0
111111 % 11 = 0
11111111 % 11 = 0
So:
1001 % 11 = (1111 - 11 * 10) % 11 = 0
100001 % 11 = (111111 - 1111 * 10) % 11 = 0
10000001 % 11 = (11111111 - 111111 * 10) % 11 = 0
For any palindrome with even digits:
abcddcba % 11
= (a * 10000001 + b * 100001 * 10 + c * 1001 * 100 + d * 11 * 1000) % 11
= 0


All palindrome with even digits is multiple of 11.
So among them, 11 is the only one prime
if (8 <= N <= 11) return 11
For other, we consider only palindrome with odd dights.


    public int primePalindrome(int N) {
        if (8 <= N && N <= 11) return 11;
        for (int x = 1; x < 100000; x++) {
            String s = Integer.toString(x), r = new StringBuilder(s).reverse().toString().substring(1);
            int y = Integer.parseInt(s + r);
            if (y >= N && isPrime(y)) return y;
        }
        return -1;
    }

    public Boolean isPrime(int x) {
        if (x < 2 || x % 2 == 0) return x == 2;
        for (int i = 3; i * i <= x; i += 2)
            if (x % i == 0) return false;
        return true;
    }
https://leetcode.com/problems/prime-palindrome/discuss/146888/Java-solution-building-closest-palindrome



    public int primePalindrome(int N) {
        while (N < Integer.MAX_VALUE) {
            N = nextPalin("" + N);
            if (isPrime(N)) {
                return N;
            }
            N++;
        }
        return -1;
    }
    private int nextPalin(String n) {
        int l = n.length();
        List<Integer> cands = new LinkedList<>();
        int half = Integer.valueOf(n.substring(0, (l + 1) / 2));
        for (int i = half; i <= half + 1; i++) {
            String halfString = "" + i;
            if (l % 2 == 1) {
                halfString = halfString.substring(0, halfString.length() - 1);
            }
            String newString = "" + i + new StringBuilder(halfString).reverse().toString();
            cands.add(Integer.valueOf(newString));
        }
        int ori = Integer.valueOf(n), result = Integer.MAX_VALUE;
        for (int cand : cands) {
            if (cand >= ori && cand < result) {
                result = cand;
            }
        }
        return result;
    }
    private boolean isPrime(int n) {
        if (n <= 1) {
            return false;
        }
        long l = (long)n;
        for (long i = 2; i * i <= l; i++) {
            if (l % i == 0) {
                return false;
            }
        }
        return true;
    }


https://leetcode.com/problems/prime-palindrome/discuss/146788/Getting-one-over-the-system-(O(1)-solution-in-Java)
generate an array of all the palindromic primes using 1553 ms. Next, I put them into my revenge array.


Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts