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

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

题目

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

题解

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

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

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

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

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

  1. class Solution {
  2. public int primePalindrome(int n) {
  3. if (n == 1) return 2;
  4. long even = primePalindromeEven(n);
  5. long odd = primePalindromeOdd(n);
  6. return (int) Math.min(even, odd);
  7. }
  8. public long primePalindromeEven(int n) {
  9. for (int L = 1; L <= 5; L++) { // 回文root的位数L
  10. for (int root = (int) Math.pow(10, L - 1); root < Math.pow(10, L); root++) { // 遍历位数为L的所有回文root
  11. // 偶数位回文串
  12. StringBuilder sb = new StringBuilder(String.valueOf(root));
  13. for (int i = L - 1; i >= 0; i--) {
  14. sb.append(sb.charAt(i));
  15. }
  16. long num = Long.parseLong(String.valueOf(sb));
  17. if (num >= n && isPrime(num)) {
  18. return num;
  19. }
  20. }
  21. }
  22. return Integer.MAX_VALUE;
  23. }
  24. public long primePalindromeOdd(int n) {
  25. for (int L = 1; L <= 5; L++) { // 回文root的位数L
  26. for (int root = (int) Math.pow(10, L - 1); root < Math.pow(10, L); root++) { // 遍历位数为L的所有回文root
  27. // 奇数位回文串
  28. StringBuilder sb = new StringBuilder(String.valueOf(root));
  29. for (int i = L - 2; i >= 0; i--) {
  30. sb.append(sb.charAt(i));
  31. }
  32. long num = Long.parseLong(String.valueOf(sb));
  33. if (num >= n && isPrime(num)) {
  34. return num;
  35. }
  36. }
  37. }
  38. return Integer.MAX_VALUE;
  39. }
  40. public boolean isPrime(long n) {
  41. if (n <= 2) return true;
  42. for (int i = 2; i <= Math.sqrt(n); i++) {
  43. if (n % i == 0) return false;
  44. }
  45. return true;
  46. }
  47. public static void main(String[] args) {
  48. Solution solution = new Solution();
  49. int i = solution.primePalindrome(9989900);
  50. System.out.println(i);
  51. }
  52. }

相关文章