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);
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://hanquan.blog.csdn.net/article/details/125583607
内容来源于网络,如有侵权,请联系作者删除!